home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / sse_m1 / sse_m1.lzh / sdd.ap next >
Text File  |  2000-02-04  |  144KB  |  7,648 lines

  1. *    SCSI Device Driver Body
  2. *    Copyright (C)1994-95 GORRY.
  3. *    $Id: sdd.ap,v 1.29 1996/12/24 12:40:13 GORRY Exp GORRY $
  4.  
  5.  
  6.         @APSTART;
  7.         @STRINGS;
  8.  
  9.  
  10.         .include    DOSCALL.MAC
  11.         .include    IOCSCALL.MAC
  12.  
  13.         .include    GORRY\GORRY.MAC
  14.         .include    DevDrv.MAC
  15.         .include    sdd.MAC
  16.         .include    sddcall.MAC
  17.  
  18.         .include    sddhed.def
  19.         .include    keep.def
  20.         .include    susie.def
  21.         .include    DevDrv.def
  22.  
  23.  
  24. *************************************************************************
  25.  
  26.  
  27. CANNOTWRITE = 0
  28.  
  29.  
  30. *************************************************************************
  31.  
  32.  
  33.         .text
  34.         dc.b    '$Id: sdd.ap,v 1.29 1996/12/24 12:40:13 GORRY Exp GORRY $',0
  35.         .even
  36.  
  37.  
  38. *************************************************************************
  39.  
  40.  
  41. DEVD_HOOK::
  42.         cmpi.l    #SDDCALL_GetSpecialOptionSDD,d0
  43.         beq    GetSpecialOptionSDD
  44.         cmpi.l    #SDDCALL_SetSpecialOptionSDD,d0
  45.         beq    SetSpecialOptionSDD
  46.         cmpi.l    #SDDCALL_SetForceProtectSDD,d0
  47.         beq    SetForceProtectSDD
  48.         cmpi.l    #SDDCALL_SetForceEjectSDD,d0
  49.         beq    SetForceEjectSDD
  50.         cmpi.l    #SDDCALL_AskSDDVersion,d0
  51.         beq    AskSDDVersion
  52.         cmpi.l    #SDDCALL_CalibrateSDD,d0
  53.         beq    CalibrateSDD
  54.         tst.l    d0 ; cmpi.l    #SDDCALL_AskSDD,d0
  55.         beq    AskSDD
  56.         cmpi.l    #SDDCALL_ReleaseSDD,d0
  57.         beq    ReleaseSDD
  58.         cmpi.l    #SDDCALL_AskReleaseSDD,d0
  59.         beq    AskReleaseSDD
  60.         rts
  61.  
  62.  
  63. *************************************************************************
  64.  
  65.  
  66.     @xproc    [ DEVD ] {
  67.       ?_JpTable::
  68.         dc.l    ?_Initialize    * $00 初期化
  69.         dc.l    ?_ExchangeCheck    * $01 メディア交換チェック
  70.         dc.l    ?_BuildBPB    * $02 BPB再構築
  71.         dc.l    ?_IOCTRLIN    * $03 IOCTRLによる入力
  72.         dc.l    ?_Read        * $04 読み込み
  73.         dc.l    ?_DrvCtrl    * $05 ドライブコントロール&センス
  74.         dc.l    ?_Err        * $06 エラー
  75.         dc.l    ?_Err        * $07 エラー
  76.         dc.l    ?_Write        * $08 書き込み
  77.         dc.l    ?_WriteV    * $09 ベリファイ付き書き込み
  78.         dc.l    ?_Err        * $0A エラー
  79.         dc.l    ?_Err        * $0B エラー
  80.         dc.l    ?_Err        * $0C エラー
  81.         dc.l    ?_Err        * $0D エラー
  82.         dc.l    ?_Err        * $0E エラー
  83.         dc.l    ?_Err        * $0F エラー
  84.         dc.l    ?_Err        * $10 エラー
  85.         dc.l    ?_Err        * $11 エラー
  86.         dc.l    ?_Err        * $12 エラー
  87.         dc.l    ?_SPIOCTRL    * $13 特殊IOCTRL
  88.         dc.l    ?_Err        * $14 エラー
  89.         dc.l    ?_Err        * $15 エラー
  90.         dc.l    ?_Err        * $16 エラー
  91.         dc.l    ?_Err        * $17 エラー
  92.  
  93.       ?_Err::
  94.         move.w    #$5003,d0
  95.         rts
  96.  
  97.  
  98. *************************************************************************
  99.  
  100.  
  101. *    long    ?_Initialize( struct REQH * );
  102. *
  103. *        デバイスドライバコマンド$00    初期化
  104. *        in    a5    リクエストヘッダ
  105. *                REQH_Magic00        常に26
  106. *                REQH_UnitNo        ユニット番号
  107. *                REQH_DevDrvEndPtr    デバイスドライバ終了アドレス
  108. *                REQH_ParamPtr        パラメータへのポインタ
  109. *        out    d0    エラーコード
  110.  
  111.  
  112.         @xproc    [ ?_Initialize ] {
  113.             @return    [ d0, ErrCode ].l;
  114.  
  115.             movem.l    d1-d7/a0-a6,-(sp)
  116.  
  117.           ?_Entry::
  118.             bsr    SCSI_S_SETFLAG
  119.             * 処理内容
  120.             move.w    #$5003,d0
  121.  
  122.           ?_Quit::
  123.             movem.l    (sp)+,d1-d7/a0-a6
  124.             rts
  125.         }
  126.  
  127.  
  128. *************************************************************************
  129.  
  130.  
  131. *    long    ?_ExchangeCheck( struct REQH * );
  132. *
  133. *        デバイスドライバコマンド$01    メディア交換チェック
  134. *        in    a5    リクエストヘッダ
  135. *                REQH_Magic00        常に26
  136. *                REQH_UnitNo        ユニット番号
  137. *                REQH_MediaID        メディアバイト
  138. *                REQH_ExchangeFlag    メディア交換フラグ
  139. *        out    d0    エラーコード
  140.  
  141.  
  142.         @xproc    [ ?_ExchangeCheck ] {
  143.             @return    [ d0, ErrCode ].l;
  144.  
  145.             movem.l    d1-d7/a0-a6,-(sp)
  146.  
  147.           ?_Entry::
  148.             bsr    AskExchangeMedia_Time
  149.             moveq.l    #1,d0
  150.             tst.b    (ReqRemakeDPB)
  151.             @ifst    {
  152.                 * HumanV2対策
  153.                 cmpi.w    #$0300,(HumanVersion)
  154.                 @ifcs    {
  155.                     bsr    RemakeDPB
  156.                 }
  157.                 moveq.l    #-1,d0
  158.             }
  159.             move.b    d0,REQH_ExchangeFlag(a5)
  160.             moveq.l    #0,d0
  161.  
  162.           ?_e::
  163.             movem.l    (sp)+,d1-d7/a0-a6
  164.             rts
  165.         }
  166.  
  167.  
  168. *************************************************************************
  169.  
  170.  
  171. *    long    ?_BuildBPB( struct REQH * );
  172. *
  173. *        デバイスドライバコマンド$02    BPB再構築
  174. *        in    a5    リクエストヘッダ
  175. *                REQH_Magic00        常に26
  176. *                REQH_UnitNo        ユニット番号
  177. *                REQH_MediaID        メディアバイト
  178. *                REQH_BPBPtrPtr        BPBテーブルへのポインタへのポインタ
  179. *        out    d0    エラーコード
  180.  
  181.  
  182.         @xproc    [ ?_BuildBPB ] {
  183.             @return    [ d0, ErrCode ].l;
  184.  
  185.             movem.l    d1-d7/a0-a6,-(sp)
  186.  
  187.           ?_Entry::
  188.             bsr    SCSI_S_SETFLAG
  189.             bsr    RemakeDPB
  190.             * 処理内容
  191.             move.w    #$5003,d0
  192.  
  193.           ?_Quit::
  194.             movem.l    (sp)+,d1-d7/a0-a6
  195.             rts
  196.         }
  197.  
  198.  
  199. *************************************************************************
  200.  
  201.  
  202. *    long    ?_Read( struct REQH * );
  203. *
  204. *        デバイスドライバコマンド$04    読み込み
  205. *        in    a5    リクエストヘッダ
  206. *                REQH_Magic00        常に26
  207. *                REQH_UnitNo        ユニット番号
  208. *                REQH_MediaID        メディアバイト
  209. *                REQH_DataBufferPtr    データバッファへのポインタ
  210. *                REQH_SecNum        セクタ数
  211. *                REQH_Sec        開始セクタ番号
  212. *        out    d0    エラーコード
  213.  
  214.  
  215.         @xproc    [ ?_Read ] {
  216.             @return    [ d0, ErrCode ].l;
  217.  
  218.             movem.l    d1-d7/a0-a6,-(sp)
  219.  
  220.           ?_Entry::
  221.             bsr    ReadSec
  222.  
  223.           ?_Quit::
  224.             movem.l    (sp)+,d1-d7/a0-a6
  225.             rts
  226.         }
  227.  
  228.  
  229. *************************************************************************
  230.  
  231.  
  232. *    long    ?_DrvCtrl( struct REQH * );
  233. *
  234. *        デバイスドライバコマンド$05    ドライブコントロール
  235. *        in    a5    リクエストヘッダ
  236. *                REQH_Magic00        常に26
  237. *                REQH_UnitNo        ユニット番号
  238. *                REQH_InnerCmd        内部コマンド
  239. *                REQH_DriveStatus    ドライブの状態を返す
  240. *        out    d0    エラーコード
  241.  
  242.  
  243.         @xproc    [ ?_DrvCtrl ] {
  244.             @return    [ d0, ErrCode ].l;
  245.  
  246.             movem.l    d1-d7/a0-a6,-(sp)
  247.  
  248.           ?_Entry::
  249.             bsr    DrvCtrl
  250.  
  251.           ?_Quit::
  252.             movem.l    (sp)+,d1-d7/a0-a6
  253.             rts
  254.         }
  255.  
  256.  
  257. *************************************************************************
  258.  
  259.  
  260. *    long    ?_Write( struct REQH * );
  261. *
  262. *        デバイスドライバコマンド$08    書き込み
  263. *        in    a5    リクエストヘッダ
  264. *                REQH_Magic00        常に26
  265. *                REQH_UnitNo        ユニット番号
  266. *                REQH_MediaID        メディアバイト
  267. *                REQH_DataBufferPtr    データバッファへのポインタ
  268. *                REQH_SecNum        セクタ数
  269. *                REQH_Sec        開始セクタ番号
  270. *        out    d0    エラーコード
  271.  
  272.  
  273.         @xproc    [ ?_Write ] {
  274.             @return    [ d0, ErrCode ].l;
  275.  
  276.             movem.l    d1-d7/a0-a6,-(sp)
  277.  
  278.           ?_Entry::
  279.             bsr    WriteSec
  280.  
  281.           ?_Quit::
  282.             movem.l    (sp)+,d1-d7/a0-a6
  283.             rts
  284.         }
  285.  
  286.  
  287. *************************************************************************
  288.  
  289.  
  290. *    long    ?_WriteV( struct REQH * );
  291. *
  292. *        デバイスドライバコマンド$09    ベリファイ付き書き込み
  293. *        in    a5    リクエストヘッダ
  294. *                REQH_Magic00        常に26
  295. *                REQH_UnitNo        ユニット番号
  296. *                REQH_MediaID        メディアバイト
  297. *                REQH_DataBufferPtr    データバッファへのポインタ
  298. *                REQH_SecNum        セクタ数
  299. *                REQH_Sec        開始セクタ番号
  300. *        out    d0    エラーコード
  301.  
  302.  
  303.         @xproc    [ ?_WriteV ] {
  304.             @return    [ d0, ErrCode ].l;
  305.  
  306.             movem.l    d1-d7/a0-a6,-(sp)
  307.  
  308.           ?_Entry::
  309.             bsr    WriteVerifySec
  310.  
  311.           ?_Quit::
  312.             movem.l    (sp)+,d1-d7/a0-a6
  313.             rts
  314.         }
  315.  
  316.  
  317. *************************************************************************
  318.  
  319.  
  320. *    long    ?_SPIOCTRL( struct REQH * );
  321. *
  322. *        デバイスドライバコマンド$0D    特殊IOCTRL
  323. *        in    a5    リクエストヘッダ
  324. *                REQH_Magic00        常に26
  325. *                REQH_UnitNo        ユニット番号
  326. *                REQH_DataBufferPtr    データバッファへのポインタ
  327. *                REQH_SPIOCTRLCmd    内部コマンド番号
  328. *        out    d0    エラーコード
  329.  
  330.  
  331.         @xproc    [ ?_SPIOCTRL ] {
  332.             @return    [ d0, ErrCode ].l;
  333.  
  334.             movem.l    d1-d7/a0-a6,-(sp)
  335.  
  336.           ?_Entry::
  337.             moveq.l    #0,d1
  338.             move.b    REQH_UnitNo(a5),d1
  339.             cmp.b    (DPBMaxCount),d1
  340.             bcc    ?_Err_UnitNo
  341.  
  342.             move.l    REQH_DataBufferPtr(a5),a1
  343.             move.w    REQH_SPIOCTRLCmd(a5),d0
  344.             @switch [ d0 ].w {
  345.               @case    #$ffff:
  346.                 move.l    #'SUSI',0(a1)
  347.                 move.b    #'E',4(a1)
  348.                 move.b    #SUSIEVERH,5(a1)
  349.                 move.b    #SUSIEVERM*16+SUSIEVERL,6(a1)
  350.                 move.b    #SUSIEVERR,7(a1)
  351.                 moveq.l    #0,d0
  352.                 @break;
  353.               @case    #$0000:
  354.                 tst.w    (FormatType)
  355.                 bmi    ?_Err_UnitNo
  356.                 lea    DPBTable,a0
  357.                 mulu    #SizeOf1DPBTable,d1
  358.                 move.l    DPBTable_XDPBPtr(a0,d1.w),d0
  359.                 beq    ?_Err_UnitNo
  360.                 move.l    d0,a3
  361.  
  362.                 moveq.l    #0,d0
  363.                 move.b    XDPB_MediaID(a3),d0
  364.                 move.w    d0,(a1)
  365.                 moveq.l    #0,d0
  366.                 @break;
  367.               @case    #$0001:
  368.                 bsr    SCSI_S_SETFLAG
  369.                 bsr    RemakeDPB
  370.                 moveq.l    #0,d0
  371.                 tst.b    (SCSI_WriteProtectFlag)
  372.                 @ifst    {
  373.                     moveq.l    #1,d0
  374.                 }
  375.                 tst.b    (ReqRemakeDPB)
  376.                 @ifst    {
  377.                     moveq.l    #-1,d0
  378.                 }
  379.                 tst.w    (FormatType)
  380.                 @ifmi    {
  381.                     moveq.l    #-1,d0
  382.                 }
  383.                 move.l    d0,(a1)+
  384.  
  385.                 moveq.l    #0,d0
  386.                 tst.w    (FormatType)
  387.                 @break.mi;
  388.                 lea    DPBTable,a0
  389.                 mulu    #SizeOf1DPBTable,d1
  390.                 move.l    DPBTable_XDPBPtr(a0,d1.w),d0
  391.                 @break.eq;
  392.                 move.l    d0,a3
  393.  
  394.                 move.w    XDPB_SecByte(a3),(a1)+
  395.                 move.b    XDPB_CluSec(a3),d0
  396.                 addq.b    #1,d0
  397.                 move.b    d0,(a1)+
  398.                 move.b    XDPB_FATNum(a3),(a1)+
  399.                 move.w    XDPB_FATSec(a3),(a1)+
  400.                 move.w    XDPB_RootEntryNum(a3),(a1)+
  401.                 move.w    XDPB_CluNum(a4),d0
  402.                 subq.w    #3,d0
  403.                 move.b    XDPB_SftCluSec(a4),d1
  404.                 andi.b    #$7f,d1
  405.                 lsl.l    d1,d0
  406.                 moveq.l    #0,d1
  407.                 move.w    XDPB_DataSec(a4),d1
  408.                 add.l    d1,d0
  409.                 cmpi.l    #$10000,d0
  410.                 @ifcc    {
  411.                     moveq.l    #0,d0
  412.                 }
  413.                 move.w    d0,(a1)+
  414.                 move.b    XDPB_MediaID(a3),(a1)+
  415.                 move.b    XDPB_FATSize(a3),(a1)+
  416.                 clr.w    (a1)+
  417.                 clr.w    (a1)+
  418.                 clr.b    (a1)+
  419.                 clr.b    (a1)
  420.  
  421.                 bsr    SCSI_S_SETFLAG
  422.                 moveq.l    #0,d0
  423.                 @break;
  424.               @case    #$0002:
  425.                 move.l    a1,d0
  426.                 @switch [ d0 ].l {
  427.                   @case    #-1:
  428.                     bsr    SCSI_S_SETFLAG
  429.                     bsr    RemakeDPB
  430.                     bsr    SCSI_S_SETFLAG
  431.                     moveq.l    #0,d0
  432.                     @break;
  433.                   @case    #0:
  434.                   @case    #1:
  435.                     moveq.l    #0,d0
  436.                     @break;
  437.                   @default:
  438.                     bra    ?_Err_Cmd
  439.                     @break;
  440.                 }
  441.                 @break;
  442.               @case    #'SU':
  443.                 move.l    REQH_DataBufferPtr(a5),a4
  444.                 movem.l    (a4),d0-d3/a0-a3
  445.                 bsr    DEVD_HOOK
  446.                 move.l    REQH_DataBufferPtr(a5),a4
  447.                 movem.l    d0-d3/a0-a3,(a4)
  448.                 moveq.l    #0,d0
  449.                 @break;
  450.               @default:
  451.                 bra    ?_Err_Cmd
  452.             }
  453.  
  454.           ?_Quit::
  455.             movem.l    (sp)+,d1-d7/a0-a6
  456.             rts
  457.  
  458.           ?_Err_UnitNo::
  459.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  460.             bra    ?_Quit
  461.  
  462.           ?_Err_Cmd::
  463.             move.w    #$5003,d0    *無効なコマンド,AI
  464.             bra    ?_Quit
  465.  
  466.         }
  467.  
  468.  
  469. *************************************************************************
  470.  
  471.  
  472. *    long    ?_IOCTRLIN( struct REQH * );
  473. *
  474. *        デバイスドライバコマンド$03    IOCTRL-IN
  475. *        in    a5    リクエストヘッダ
  476. *                REQH_Magic00        常に26
  477. *                REQH_UnitNo        ユニット番号
  478. *                REQH_DataBufferPtr    データバッファへのポインタ
  479. *                REQH_SPIOCTRLCmd    内部コマンド番号
  480. *        out    d0    エラーコード
  481.  
  482.  
  483.         @xproc    [ ?_IOCTRLIN ] {
  484.             @return    [ d0, ErrCode ].l;
  485.  
  486.             movem.l    d1-d7/a0-a6,-(sp)
  487.  
  488.           ?_Entry::
  489.             moveq.l    #0,d1
  490.             move.b    REQH_UnitNo(a5),d1
  491.             cmp.b    (DPBMaxCount),d1
  492.             bcc    ?_Err_UnitNo
  493.  
  494.             move.l    REQH_DataBufferPtr(a5),a1
  495.             move.l    REQH_SPIOCTRLCmd(a5),d0
  496.             @switch [ d0 ].w {
  497.               @case    #$ffff:
  498.                 move.l    #'SUSI',0(a1)
  499.                 move.b    #'E',4(a1)
  500.                 move.b    #SUSIEVERH,5(a1)
  501.                 move.b    #SUSIEVERM*16+SUSIEVERL,6(a1)
  502.                 move.b    #SUSIEVERR,7(a1)
  503.                 moveq.l    #0,d0
  504.                 @break;
  505.               @case    #$0004:
  506.                 move.l    (SCSI_ID),d0
  507.                 andi.l    #$0007ffff,d0
  508.                 move.l    d0,0(a1)
  509.                 moveq.l    #0,d0
  510.                 @break;
  511.               @case    #$0008:
  512.                 move.l    (SCSI_ID),d0
  513.                 andi.l    #$0007ffff,d0
  514.                 move.l    d0,0(a1)
  515.                 clr.l    4(a1)
  516.                 moveq.l    #0,d0
  517.                 @break;
  518.               @case    #'SU':
  519.                 move.l    REQH_DataBufferPtr(a5),a4
  520.                 movem.l    (a4),d0-d3/a0-a3
  521.                 bsr    DEVD_HOOK
  522.                 move.l    REQH_DataBufferPtr(a5),a4
  523.                 movem.l    d0-d3/a0-a3,(a4)
  524.                 moveq.l    #0,d0
  525.                 @break;
  526.               @default:
  527.                 bra    ?_Err_Cmd
  528.             }
  529.  
  530.           ?_Quit::
  531.             movem.l    (sp)+,d1-d7/a0-a6
  532.             rts
  533.  
  534.           ?_Err_UnitNo::
  535.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  536.             bra    ?_Quit
  537.  
  538.           ?_Err_Cmd::
  539.             move.w    #$5003,d0    *無効なコマンド,AI
  540.             bra    ?_Quit
  541.  
  542.         }
  543.  
  544.  
  545. *************************************************************************
  546.  
  547.  
  548.     }
  549.  
  550.  
  551. *************************************************************************
  552.  
  553.  
  554.     @xproc    [ DEVD2 ] {
  555.       ?_JpTable::
  556.         dc.l    ?_Initialize    * $C0 初期化
  557.         dc.l    ?_FindDir    * $C1 ディレクトリ検索
  558.         dc.l    ?_Err        * $C2 エラー
  559.         dc.l    ?_Err        * $C3 エラー
  560.         dc.l    ?_Err        * $C4 エラー
  561.         dc.l    ?_Err        * $C5 エラー
  562.         dc.l    ?_FindFil    * $C6 ファイル検索
  563.         dc.l    ?_Files        * $C7 ディレクトリリスト1番目取得
  564.         dc.l    ?_NFiles    * $C8 ディレクトリリスト2番目以降取得
  565.         dc.l    ?_Err        * $C9 エラー
  566.         dc.l    ?_Open        * $CA ファイルオープン
  567.         dc.l    ?_Close        * $CB ファイルクローズ
  568.         dc.l    ?_Read        * $CC ファイルリード
  569.         dc.l    ?_Err        * $CD おそらくファイルライト
  570.         dc.l    ?_Seek        * $CE ファイルシーク
  571.         dc.l    ?_CFCall    * $CF 不明
  572.         dc.l    ?_GetCap    * $D0 容量取得
  573.         dc.l    ?_DrvCtrl    * $D1 ドライブコントロール
  574.         dc.l    ?_GetDPB    * $D2 DPB取得
  575.         dc.l    ?_IORead    * $D3 メディア直接リード
  576.         dc.l    ?_Err        * $D4 エラー
  577.         dc.l    ?_IOCtrl    * $D5 ドライブ直接コントロール
  578.         dc.l    ?_Abort        * $D6 アボート処理
  579.         dc.l    ?_ExgCheck    * $D7 ディスク入れ換えチェック
  580.         dc.l    ?_D8Call    * $D8 不明
  581.  
  582.       ?_Err::
  583.         move.w    #$700e,d0
  584.         rts
  585.  
  586.  
  587. *************************************************************************
  588.  
  589.  
  590. *    long    ?_Initialize( struct REQH * );
  591. *
  592. *        デバイスドライバコマンド$C0    初期化
  593. *        in    a5    リクエストヘッダ
  594. *                REQH_Magic00        常に26
  595. *                REQH_UnitNo        ユニット番号
  596. *                REQH_DevDrvEndPtr    デバイスドライバ終了アドレス
  597. *                REQH_ParamPtr        パラメータへのポインタ
  598. *        out    d0    エラーコード
  599.  
  600.  
  601.         @xproc    [ ?_Initialize ] {
  602.             @return    [ d0, ErrCode ].l;
  603.  
  604.             movem.l    d1-d7/a0-a6,-(sp)
  605.  
  606.           ?_Entry::
  607.             bsr    SCSI_S_SETFLAG
  608.             * 処理内容
  609.             move.w    #$5003,d0
  610.  
  611.           ?_Quit::
  612.             movem.l    (sp)+,d1-d7/a0-a6
  613.             rts
  614.         }
  615.  
  616.  
  617. *************************************************************************
  618.  
  619.  
  620. *    long    ?_FindDir( struct REQH * );
  621. *
  622. *        デバイスドライバコマンド$C1    ディレクトリ検索
  623. *        in    a5    リクエストヘッダ
  624. *                REQH_Magic00        常に26
  625. *                REQH_UnitNo        ユニット番号
  626. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  627. *                REQH_Result        検索結果を返す
  628. *        out    d0    エラーコード
  629.  
  630.  
  631.         @xproc    [ ?_FindDir ] {
  632.             @return    [ d0, ErrCode ].l;
  633.  
  634.             movem.l    d1-d7/a0-a6,-(sp)
  635.  
  636.           ?_Entry::
  637.             clr.l    (ReturnResult)
  638.             movea.l    REQH_OSFileNamePtr(a5),a3
  639.             addq.w    #2,a3
  640.             tst.b    1(a3)
  641.             beq    ?_NoWork
  642.  
  643.             bsr    FindDir
  644.             cmpi.w    #1,d0
  645.             @ifeq    {
  646.                 moveq.l    #0,d0
  647.                 bra    ?_Quit
  648.             }
  649.             tst.w    d0
  650.             bne    ?_Quit
  651.             move.l    (ReturnResult),REQH_Result(a5)
  652.  
  653.           ?_Quit::
  654.             movem.l    (sp)+,d1-d7/a0-a6
  655.             rts
  656.  
  657.           ?_NoWork::
  658.             moveq.l    #0,d0
  659.             move.l    d0,REQH_Result(a5)
  660.             bra    ?_Quit
  661.  
  662.         }
  663.  
  664.  
  665. *************************************************************************
  666.  
  667.  
  668. *    long    ?_FindFil( struct REQH * );
  669. *
  670. *        デバイスドライバコマンド$C6    ファイル検索
  671. *        in    a5    リクエストヘッダ
  672. *                REQH_Magic00        常に26
  673. *                REQH_UnitNo        ユニット番号
  674. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  675. *                REQH_Result        検索結果を返す
  676. *        out    d0    エラーコード
  677.  
  678.  
  679.         @xproc    [ ?_FindFil ] {
  680.             @return    [ d0, ErrCode ].l;
  681.  
  682.             movem.l    d1-d7/a0-a6,-(sp)
  683.  
  684.           ?_Entry::
  685.             clr.l    (ReturnResult)
  686.             bsr    FindDir
  687.             cmpi.w    #1,d0
  688.             @ifeq    {
  689.                 moveq.l    #0,d0
  690.                 bra    ?_Quit
  691.             }
  692.             tst.w    d0
  693.             bne    ?_Quit
  694.             tst.l    (ReturnResult)
  695.             bmi    ?_Result
  696.             bsr    FindFil
  697.             cmpi.w    #1,d0
  698.             @ifeq    {
  699.                 moveq.l    #0,d0
  700.                 bra    ?_Quit
  701.             }
  702.             tst.w    d0
  703.             bne    ?_Quit
  704.           ?_Result::
  705.             move.l    (ReturnResult),REQH_Result(a5)
  706.  
  707.           ?_Quit::
  708.             movem.l    (sp)+,d1-d7/a0-a6
  709.             rts
  710.         }
  711.  
  712.  
  713. *************************************************************************
  714.  
  715.  
  716. *    long    ?_Files( struct REQH * );
  717. *
  718. *        デバイスドライバコマンド$C7    ディレクトリリスト1番目を得る
  719. *        in    a5    リクエストヘッダ
  720. *                REQH_Magic00        常に26
  721. *                REQH_UnitNo        ユニット番号
  722. *                REQH_FindAtr        検索属性
  723. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  724. *                REQH_DirListPtr        ディレクトリリストを返す
  725. *                REQH_Result        検索結果を返す
  726. *        out    d0    エラーコード
  727.  
  728.  
  729.         @xproc    [ ?_Files ] {
  730.             @return    [ d0, ErrCode ].l;
  731.  
  732.             movem.l    d1-d7/a0-a6,-(sp)
  733.  
  734.           ?_Entry::
  735.             clr.l    (ReturnResult)
  736.             bsr    FindDir
  737.             cmpi.w    #1,d0
  738.             @ifeq    {
  739.                 moveq.l    #0,d0
  740.                 bra    ?_Quit
  741.             }
  742.             tst.w    d0
  743.             bne    ?_Quit
  744.             tst.l    (ReturnResult)
  745.             bmi    ?_Result
  746.             bsr    StartFiles
  747.             cmpi.w    #1,d0
  748.             @ifeq    {
  749.                 moveq.l    #0,d0
  750.                 bra    ?_Quit
  751.             }
  752.             tst.w    d0
  753.             bne    ?_Quit
  754.           ?_Result::
  755.             move.l    (ReturnResult),REQH_Result(a5)
  756.  
  757.           ?_Quit::
  758.             movem.l    (sp)+,d1-d7/a0-a6
  759.             rts
  760.         }
  761.  
  762.  
  763. *************************************************************************
  764.  
  765.  
  766. *    long    ?_NFiles( struct REQH * );
  767. *
  768. *        デバイスドライバコマンド$C8    ディレクトリリスト2番目以降を得る
  769. *        in    a5    リクエストヘッダ
  770. *                REQH_Magic00        常に26
  771. *                REQH_UnitNo        ユニット番号
  772. *                REQH_DirListPtr        ディレクトリリストを返す
  773. *                REQH_Result        検索結果を返す
  774. *        out    d0    エラーコード
  775.  
  776.  
  777.         @xproc    [ ?_NFiles ] {
  778.             @return    [ d0, ErrCode ].l;
  779.  
  780.             movem.l    d1-d7/a0-a6,-(sp)
  781.  
  782.           ?_Entry::
  783.             clr.l    (ReturnResult)
  784.             bsr    NextFiles
  785.             cmpi.w    #1,d0
  786.             @ifeq    {
  787.                 moveq.l    #0,d0
  788.                 bra    ?_Quit
  789.             }
  790.             tst.w    d0
  791.             bne    ?_Quit
  792.             move.l    (ReturnResult),REQH_Result(a5)
  793.  
  794.           ?_Quit::
  795.             movem.l    (sp)+,d1-d7/a0-a6
  796.             rts
  797.         }
  798.  
  799.  
  800. *************************************************************************
  801.  
  802.  
  803. *    long    ?_Open( struct REQH * );
  804. *
  805. *        デバイスドライバコマンド$CA    ファイルを開く
  806. *        in    a5    リクエストヘッダ
  807. *                REQH_Magic00        常に26
  808. *                REQH_UnitNo        ユニット番号
  809. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  810. *                REQH_Result        検索結果を返す
  811. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  812. *        out    d0    エラーコード
  813.  
  814.  
  815.         @xproc    [ ?_Open ] {
  816.             @return    [ d0, ErrCode ].l;
  817.  
  818.             movem.l    d1-d7/a0-a6,-(sp)
  819.  
  820.           ?_Entry::
  821.             clr.l    (ReturnResult)
  822.             bsr    FindDir
  823.             cmpi.w    #1,d0
  824.             @ifeq    {
  825.                 moveq.l    #0,d0
  826.                 bra    ?_Quit
  827.             }
  828.             tst.w    d0
  829.             bne    ?_Quit
  830.             tst.l    (ReturnResult)
  831.             bmi    ?_Result
  832.             bsr    OpenFil
  833.             cmpi.w    #1,d0
  834.             @ifeq    {
  835.                 moveq.l    #0,d0
  836.                 bra    ?_Quit
  837.             }
  838.             tst.w    d0
  839.             bne    ?_Quit
  840.           ?_Result::
  841.             move.l    (ReturnResult),REQH_Result(a5)
  842.  
  843.           ?_Quit::
  844.             movem.l    (sp)+,d1-d7/a0-a6
  845.             rts
  846.         }
  847.  
  848.  
  849. *************************************************************************
  850.  
  851.  
  852. *    long    ?_Close( struct REQH * );
  853. *
  854. *        デバイスドライバコマンド$CB    ファイルを閉じる
  855. *        in    a5    リクエストヘッダ
  856. *                REQH_Magic00        常に26
  857. *                REQH_UnitNo        ユニット番号
  858. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  859. *                REQH_Result        検索結果を返す
  860. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  861. *        out    d0    エラーコード
  862.  
  863.  
  864.         @xproc    [ ?_Close ] {
  865.             @return    [ d0, ErrCode ].l;
  866.  
  867.             movem.l    d1-d7/a0-a6,-(sp)
  868.  
  869.           ?_Entry::
  870.             clr.l    (ReturnResult)
  871.             bsr    CloseFil
  872.             tst.w    d0
  873.             bne    ?_Quit
  874.             move.l    (ReturnResult),REQH_Result(a5)
  875.  
  876.           ?_Quit::
  877.             movem.l    (sp)+,d1-d7/a0-a6
  878.             rts
  879.         }
  880.  
  881.  
  882. *************************************************************************
  883.  
  884.  
  885. *    long    ?_Read( struct REQH * );
  886. *
  887. *        デバイスドライバコマンド$CC    ファイルを読む
  888. *        in    a5    リクエストヘッダ
  889. *                REQH_Magic00        常に26
  890. *                REQH_UnitNo        ユニット番号
  891. *                REQH_AccessSize        アクセスサイズ
  892. *                REQH_Result        検索結果を返す
  893. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  894. *        out    d0    エラーコード
  895.  
  896.  
  897.         @xproc    [ ?_Read ] {
  898.             @return    [ d0, ErrCode ].l;
  899.  
  900.             movem.l    d1-d7/a0-a6,-(sp)
  901.  
  902.           ?_Entry::
  903.             bsr    ReadFil
  904.             tst.w    d0
  905.             bne    ?_Quit
  906.  
  907.           ?_Quit::
  908.             movem.l    (sp)+,d1-d7/a0-a6
  909.             rts
  910.         }
  911.  
  912.  
  913. *************************************************************************
  914.  
  915.  
  916. *    long    ?_Seek( struct REQH * );
  917. *
  918. *        デバイスドライバコマンド$CD    ファイルのシークを行なう
  919. *        in    a5    リクエストヘッダ
  920. *                REQH_Magic00        常に26
  921. *                REQH_UnitNo        ユニット番号
  922. *                REQH_SeekMode        シークモード
  923. *                REQH_AccessSize        アクセスサイズ
  924. *                REQH_Result        検索結果を返す
  925. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  926. *        out    d0    エラーコード
  927.  
  928.  
  929.         @xproc    [ ?_Seek ] {
  930.             @return    [ d0, ErrCode ].l;
  931.  
  932.             movem.l    d1-d7/a0-a6,-(sp)
  933.  
  934.           ?_Entry::
  935.             bsr    SeekFil
  936.             tst.w    d0
  937.             bne    ?_Quit
  938.  
  939.           ?_Quit::
  940.             movem.l    (sp)+,d1-d7/a0-a6
  941.             rts
  942.         }
  943.  
  944.  
  945. *************************************************************************
  946.  
  947.  
  948. *    long    ?_CFCall( struct REQH * );
  949. *
  950. *        デバイスドライバコマンド$CF    不明
  951. *        in    a5    リクエストヘッダ
  952. *                REQH_Magic00        常に26
  953. *                REQH_UnitNo        ユニット番号
  954. *        out    d0    エラーコード
  955.  
  956.  
  957.         @xproc    [ ?_CFCall ] {
  958.             @return    [ d0, ErrCode ].l;
  959.  
  960.             movem.l    d1-d7/a0-a6,-(sp)
  961.  
  962.           ?_Entry::
  963.             move.l    REQH_AccessSize(a5),d0
  964.             @ifeq    {
  965.                 move.l    REQH_FileInfoPtr(a5),a4
  966.                 move.w    $3a(a4),$14(a5)
  967.                 move.w    $3c(a4),$12(a5)
  968.                 moveq.l    #0,d0
  969.             } @else {
  970.                 moveq.l    #$f2,d0
  971.             }
  972.  
  973.           ?_Quit::
  974.             movem.l    (sp)+,d1-d7/a0-a6
  975.             rts
  976.         }
  977.  
  978.  
  979. *************************************************************************
  980.  
  981.  
  982. *    long    ?_GetCap( struct REQH * );
  983. *
  984. *        デバイスドライバコマンド$D0    容量取得
  985. *        in    a5    リクエストヘッダ
  986. *                REQH_Magic00        常に26
  987. *                REQH_UnitNo        ユニット番号
  988. *                REQH_DataBufferPtr    容量データを返すバッファへのポインタ
  989. *                REQH_Result        結果を返す
  990. *        out    d0    エラーコード
  991.  
  992.  
  993.         @xproc    [ ?_GetCap ] {
  994.             @return    [ d0, ErrCode ].l;
  995.  
  996.             movem.l    d1-d7/a0-a6,-(sp)
  997.  
  998.           ?_Entry::
  999.             clr.l    (ReturnResult)
  1000.             bsr    GetCap
  1001.             tst.w    d0
  1002.             bne    ?_Quit
  1003.             move.l    (ReturnResult),REQH_Result(a5)
  1004.  
  1005.           ?_Quit::
  1006.             movem.l    (sp)+,d1-d7/a0-a6
  1007.             rts
  1008.         }
  1009.  
  1010.  
  1011. *************************************************************************
  1012.  
  1013.  
  1014. *    long    ?_DrvCtrl( struct REQH * );
  1015. *
  1016. *        デバイスドライバコマンド$D1    ドライブコントロール
  1017. *        in    a5    リクエストヘッダ
  1018. *                REQH_Magic00        常に26
  1019. *                REQH_UnitNo        ユニット番号
  1020. *                REQH_InnerCmd        内部コマンド
  1021. *                REQH_DriveStatus    ドライブの状態を返す
  1022. *        out    d0    エラーコード
  1023.  
  1024.  
  1025.         @xproc    [ ?_DrvCtrl ] {
  1026.             @return    [ d0, ErrCode ].l;
  1027.  
  1028.             movem.l    d1-d7/a0-a6,-(sp)
  1029.  
  1030.           ?_Entry::
  1031.             bsr    DrvCtrl
  1032.  
  1033.           ?_Quit::
  1034.             movem.l    (sp)+,d1-d7/a0-a6
  1035.             rts
  1036.         }
  1037.  
  1038.  
  1039. *************************************************************************
  1040.  
  1041.  
  1042. *    long    ?_GetDPB( struct REQH * );
  1043. *
  1044. *        デバイスドライバコマンド$D2    DPB取得
  1045. *        in    a5    リクエストヘッダ
  1046. *                REQH_Magic00        常に26
  1047. *                REQH_UnitNo        ユニット番号
  1048. *                REQH_DataBufferPtr    DPBを返すバッファへのポインタ
  1049. *                REQH_Result        結果を返す
  1050. *        out    d0    エラーコード
  1051.  
  1052.  
  1053.         @xproc    [ ?_GetDPB ] {
  1054.             @return    [ d0, ErrCode ].l;
  1055.  
  1056.             movem.l    d1-d7/a0-a6,-(sp)
  1057.  
  1058.           ?_Entry::
  1059.             move.l    REQH_DataBufferPtr(a5),a0
  1060.             move.w    #$0800,$00(a0)
  1061.             move.b    #$f5,$14(a0)
  1062.             moveq.l    #$f2,d0
  1063.             move.l    d0,REQH_Result(a5)
  1064.             moveq.l    #0,d0
  1065.  
  1066.           ?_Quit::
  1067.             movem.l    (sp)+,d1-d7/a0-a6
  1068.             rts
  1069.         }
  1070.  
  1071.  
  1072. *************************************************************************
  1073.  
  1074.  
  1075. *    long    ?_IORead( struct REQH * );
  1076. *
  1077. *        デバイスドライバコマンド$D3    ドライブから直接読む
  1078. *        in    a5    リクエストヘッダ
  1079. *                REQH_Magic00        常に26
  1080. *                REQH_UnitNo        ユニット番号
  1081. *                REQH_MediaID        メディアバイト
  1082. *                REQH_DataBufferPtr    データバッファへのポインタ
  1083. *                REQH_SecNum        セクタ数
  1084. *                REQH_Sec        開始セクタ番号
  1085. *                REQH_Result        結果を返す
  1086. *        out    d0    エラーコード
  1087.  
  1088.  
  1089.         @xproc    [ ?_IORead ] {
  1090.             @return    [ d0, ErrCode ].l;
  1091.  
  1092.             movem.l    d1-d7/a0-a6,-(sp)
  1093.  
  1094.           ?_Entry::
  1095.             bsr    ReadSec
  1096.             moveq.l    #0,d0
  1097.             move.l    d0,REQH_Result(a5)
  1098.  
  1099.           ?_Quit::
  1100.             movem.l    (sp)+,d1-d7/a0-a6
  1101.             rts
  1102.         }
  1103.  
  1104.  
  1105. *************************************************************************
  1106.  
  1107.  
  1108. *    long    ?_IOCtrl( struct REQH * );
  1109. *
  1110. *        デバイスドライバコマンド$D5    ドライブ直接コントロール
  1111. *        in    a5    リクエストヘッダ
  1112. *                REQH_Magic00        常に26
  1113. *                REQH_UnitNo        ユニット番号
  1114. *                REQH_DataBufferPtr    データバッファへのポインタ
  1115. *                REQH_SPIOCTRLCmd    内部コマンド番号
  1116. *                REQH_Result        結果を返す
  1117. *        out    d0    エラーコード
  1118.  
  1119.  
  1120.         @xproc    [ ?_IOCtrl ] {
  1121.             @return    [ d0, ErrCode ].l;
  1122.  
  1123.             movem.l    d1-d7/a0-a6,-(sp)
  1124.  
  1125.           ?_Entry::
  1126.             move.l    REQH_DataBufferPtr(a5),a0
  1127.             move.w    REQH_SPIOCTRLCmd(a5),d0
  1128.             @switch [ d0 ].w {
  1129.               @case    #$ffff:
  1130.                 move.l    #'SUSI',0(a0)
  1131.                 move.b    #'E',4(a0)
  1132.                 move.b    #SUSIEVERH,5(a0)
  1133.                 move.b    #SUSIEVERM*16+SUSIEVERL,6(a0)
  1134.                 move.b    #SUSIEVERR,7(a0)
  1135.                 moveq.l    #0,d0
  1136.                 move.l    d0,REQH_Result(a5)
  1137.                 @break;
  1138.  
  1139.               @case    #$0000:
  1140.                 move.w    #$00f5,$00(a0)
  1141.                 moveq.l    #0,d0
  1142.                 move.l    d0,REQH_Result(a5)
  1143.                 @break;
  1144.  
  1145.               @case    #$8000:
  1146.                 clr.l    (ReturnResult)
  1147.                 bsr    ReadTOC
  1148.                 tst.w    d0
  1149.                 bne    ?_Quit
  1150.                 move.l    (ReturnResult),REQH_Result(a5)
  1151.                 @break;
  1152.  
  1153.               @case    #$8001:
  1154.                 clr.l    (ReturnResult)
  1155.                 bsr    PlayAudio
  1156.                 tst.w    d0
  1157.                 bne    ?_Quit
  1158.                 move.l    (ReturnResult),REQH_Result(a5)
  1159.                 @break;
  1160.  
  1161.               @case    #$8003:
  1162.                 clr.l    (ReturnResult)
  1163.                 bsr    StopAudio
  1164.                 tst.w    d0
  1165.                 bne    ?_Quit
  1166.                 move.l    (ReturnResult),REQH_Result(a5)
  1167.                 @break;
  1168.  
  1169.               @case    #$8004:
  1170.                 clr.l    (ReturnResult)
  1171.                 bsr    ReadSubChannel
  1172.                 tst.w    d0
  1173.                 bne    ?_Quit
  1174.                 move.l    (ReturnResult),REQH_Result(a5)
  1175.                 @break;
  1176.  
  1177.               @case    #$8005:
  1178.                 moveq.l    #$f2,d0
  1179.                 move.l    d0,REQH_Result(a5)
  1180.                 move.w    #0,d0
  1181.                 @break;
  1182.  
  1183.               @case    #$8006:
  1184.                 bsr    ?_CheckSub
  1185.                 tst.l    d0
  1186.                 @ifeq    {
  1187.                     tst.b    (AudioCDExchangeFlag)
  1188.                     sne    d0
  1189.                     clr.b    (AudioCDExchangeFlag)
  1190.                 } @else {
  1191.                     st.b    (AudioCDExchangeFlag)
  1192.                     moveq.l    #0,d0
  1193.                 }
  1194.                 move.b    d0,(a0)
  1195.                 moveq.l    #0,d0
  1196.                 move.l    d0,REQH_Result(a5)
  1197.                 @break;
  1198.  
  1199.               @case    #$8007:
  1200.                 move.l    (SCSI_ID),d0
  1201.                 andi.l    #$0007ffff,d0
  1202.                 move.l    d0,(a0)
  1203.                 moveq.l    #0,d0
  1204.                 move.l    d0,REQH_Result(a5)
  1205.                 @break;
  1206.  
  1207.               @case    #$8008:
  1208.                 clr.l    (ReturnResult)
  1209.                 bsr    ReadTOC2
  1210.                 tst.w    d0
  1211.                 bne    ?_Quit
  1212.                 move.l    (ReturnResult),REQH_Result(a5)
  1213.                 @break;
  1214.  
  1215.               @case    #$8009:
  1216.                 clr.l    (ReturnResult)
  1217.                 bsr    ReadTOC3
  1218.                 tst.w    d0
  1219.                 bne    ?_Quit
  1220.                 move.l    (ReturnResult),REQH_Result(a5)
  1221.                 @break;
  1222.  
  1223.               @case    #$800A:
  1224.                 clr.l    (ReturnResult)
  1225.                 bsr    PauseResume
  1226.                 tst.w    d0
  1227.                 bne    ?_Quit
  1228.                 move.l    (ReturnResult),REQH_Result(a5)
  1229.                 @break;
  1230.  
  1231.               @case    #'SU':
  1232.                 move.l    REQH_DataBufferPtr(a5),a4
  1233.                 movem.l    (a4),d0-d3/a0-a3
  1234.                 bsr    DEVD_HOOK
  1235.                 move.l    REQH_DataBufferPtr(a5),a4
  1236.                 movem.l    d0-d3/a0-a3,(a4)
  1237.                 moveq.l    #0,d0
  1238.                 move.l    d0,REQH_Result(a5)
  1239.                 @break;
  1240.  
  1241.               @default:
  1242.                 tst.w    d0
  1243.                 @ifmi    {
  1244.                     moveq.l    #$ff,d0
  1245.                 } @else {
  1246.                     moveq.l    #$f2,d0
  1247.                 }
  1248.                 move.l    d0,REQH_Result(a5)
  1249.                 moveq.l    #0,d0
  1250.                 @break;
  1251.             }
  1252.  
  1253.           ?_Quit::
  1254.             movem.l    (sp)+,d1-d7/a0-a6
  1255.             rts
  1256.  
  1257.  
  1258.           ?_CheckSub::
  1259.             movem.l    d1-d7/a0-a6,-(sp)
  1260.  
  1261.             bra    ?_EnterTestUnit
  1262.           ?_RetryTestUnit::
  1263.             bsr    WaitSec
  1264.           ?_EnterTestUnit::
  1265.             move.l    (SCSI_ID),d4
  1266.             andi.l    #$0007ffff,d4
  1267.             SCSI    _S_TESTUNIT
  1268.             tst.l    d0
  1269.             @ifmi    {
  1270.                 st.b    (ReqAskSCSIConnect)
  1271.                 st.b    (RealEjectedFlag)
  1272.                 bra    ?_Change
  1273.             }
  1274.             tst.l    d0
  1275.             @ifne    {
  1276.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1277.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1278.                     move.l    d0,d7
  1279.                     bsr    SCSI_S_REQUEST
  1280.                     cmpi.w    #6,d0
  1281.                     @ifeq    {
  1282.                         bsr    SCSI_S_SETFLAG
  1283.                         bra    ?_OKTestUnit
  1284.                     }
  1285.                     tst.b    (SCSI_WaitBusyFlag)
  1286.                     @ifst    {
  1287.                         tst.w    d0
  1288.                         beq    ?_OKTestUnit
  1289.                         cmpi.w    #1,d0
  1290.                         beq    ?_OKTestUnit
  1291.                     }
  1292.                     move.l    d7,d0
  1293.                 }
  1294.                 st.b    (RealEjectedFlag)
  1295.                 bra    ?_Change
  1296.             }
  1297.           ?_OKTestUnit::
  1298.             moveq.l    #0,d0
  1299.           ?_CheckSub_e::
  1300.             movem.l    (sp)+,d1-d7/a0-a6
  1301.             rts
  1302.  
  1303.           ?_Change::
  1304.             bsr    SCSI_S_SETFLAG
  1305.             moveq.l    #1,d0
  1306.             bra    ?_CheckSub_e
  1307.  
  1308.         }
  1309.  
  1310.  
  1311. *************************************************************************
  1312.  
  1313.  
  1314. *    long    ?_Abort( struct REQH * );
  1315. *
  1316. *        デバイスドライバコマンド$D6    アボート時処理
  1317. *        in    a5    リクエストヘッダ
  1318. *                REQH_Magic00        常に26
  1319. *                REQH_UnitNo        ユニット番号
  1320. *                REQH_Result        結果を返す
  1321. *        out    d0    エラーコード
  1322.  
  1323.  
  1324.         @xproc    [ ?_Abort ] {
  1325.             @return    [ d0, ErrCode ].l;
  1326.  
  1327.             movem.l    d1-d7/a0-a6,-(sp)
  1328.  
  1329.           ?_Entry::
  1330.             moveq.l    #$f2,d0
  1331.             move.l    d0,REQH_Result(a5)
  1332.             moveq.l    #0,d0
  1333.  
  1334.           ?_Quit::
  1335.             movem.l    (sp)+,d1-d7/a0-a6
  1336.             rts
  1337.  
  1338.         }
  1339.  
  1340.  
  1341. *************************************************************************
  1342.  
  1343.  
  1344. *    long    ?_ExgCheck( struct REQH * );
  1345. *
  1346. *        デバイスドライバコマンド$D7    ディスク入れ換えチェック
  1347. *        in    a5    リクエストヘッダ
  1348. *                REQH_Magic00        常に26
  1349. *                REQH_UnitNo        ユニット番号
  1350. *                REQH_Result        結果を返す
  1351. *        out    d0    エラーコード
  1352.  
  1353.  
  1354.         @xproc    [ ?_ExgCheck ] {
  1355.             @return    [ d0, ErrCode ].l;
  1356.  
  1357.             movem.l    d1-d7/a0-a6,-(sp)
  1358.  
  1359.           ?_Entry::
  1360.             bsr    GetTime
  1361.             move.l    (LastAccessTime),d2
  1362.             move.l    (LastAccessDate),d3
  1363.             sub.l    d3,d1
  1364.             @ifne    {
  1365.                 add.l    #8640000,d0
  1366.             }
  1367.             sub.l    d2,d0
  1368.             tst.b    (ReqRemakeDPB)
  1369.             @ifst    {
  1370.                 cmp.l    (SpOption_TIN),d0
  1371.             } @else {
  1372.                 cmp.l    (SpOption_TEJ),d0
  1373.             }
  1374.             bcs    ?_NoCheck
  1375.             bsr    GetTime
  1376.             move.l    d0,(LastAccessTime)
  1377.             move.l    d1,(LastAccessDate)
  1378.  
  1379.             bsr    DEVD2_IOCtrl_CheckSub
  1380.             tst.l    d0
  1381.             @ifeq    {
  1382.                 tst.b    (CDROMExchangeFlag)
  1383.                 @ifne    {
  1384.                     tst.b    (ReqRemakeDPB)
  1385.                     @ifst    {
  1386.                         bsr    RemakeDPB
  1387.                     }
  1388.                     moveq.l    #$ff,d0
  1389.                 }
  1390.                 clr.b    (CDROMExchangeFlag)
  1391.             } @else {
  1392.                 moveq.l    #0,d0
  1393.                 st.b    (CDROMExchangeFlag)
  1394.             }
  1395.             move.l    d0,REQH_Result(a5)
  1396.             moveq.l    #0,d0
  1397.  
  1398.           ?_Quit::
  1399.             movem.l    (sp)+,d1-d7/a0-a6
  1400.             rts
  1401.  
  1402.           ?_NoCheck::
  1403.             moveq.l    #0,d0
  1404.             move.l    d0,REQH_Result(a5)
  1405.             bra    ?_Quit
  1406.  
  1407.         }
  1408.  
  1409.  
  1410. *************************************************************************
  1411.  
  1412.  
  1413. *    long    ?_D8Call( struct REQH * );
  1414. *
  1415. *        デバイスドライバコマンド$D8    不明
  1416. *        in    a5    リクエストヘッダ
  1417. *                REQH_Magic00        常に26
  1418. *                REQH_UnitNo        ユニット番号
  1419. *                REQH_Result        結果を返す
  1420. *        out    d0    エラーコード
  1421.  
  1422.  
  1423.         @xproc    [ ?_D8Call ] {
  1424.             @return    [ d0, ErrCode ].l;
  1425.  
  1426.             movem.l    d1-d7/a0-a6,-(sp)
  1427.  
  1428.           ?_Entry::
  1429.             moveq.l    #$f2,d0
  1430.             move.l    d0,REQH_Result(a5)
  1431.             moveq.l    #0,d0
  1432.  
  1433.           ?_Quit::
  1434.             movem.l    (sp)+,d1-d7/a0-a6
  1435.             rts
  1436.  
  1437.         }
  1438.  
  1439.  
  1440. *************************************************************************
  1441.  
  1442.  
  1443.     }
  1444.  
  1445.  
  1446. *************************************************************************
  1447.  
  1448.  
  1449. *    long    SCSI_S_SETFLAG( void );
  1450. *
  1451. *        SCSI初期化用のフラグを設定する。
  1452. *        in    なし
  1453. *        out    なし
  1454.  
  1455.         @xproc    [ SCSI_S_SETFLAG ] {
  1456.             st.b    (ReqRemakeDPB)
  1457.             st.b    (ReqSendRezeroUnit)
  1458.             st.b    (LastExchangeFlag)
  1459.             move.b    #1,(AudioCDExchangeFlag)
  1460.             move.b    #1,(CDROMExchangeFlag)
  1461.             rts
  1462.         }
  1463.  
  1464.  
  1465. *************************************************************************
  1466.  
  1467.  
  1468. *    long    SCSI_S_REQUEST( void );
  1469. *
  1470. *        SCSIへリクエストコマンドを発行する。
  1471. *        in    IOCS _S_REQUESTに必要なパラメータ
  1472. *        out    d0    エラーコード
  1473.  
  1474.         @xproc    [ SCSI_S_REQUEST ] {
  1475.             @return    [ d0, ErrCode ].l;
  1476.  
  1477.             movem.l    d3/a1,-(sp)
  1478.           ?_Retry::
  1479.             moveq.l    #$0e,d3
  1480.             lea    SCSI_REQUESTBuf,a1
  1481.             SCSI    _S_REQUEST
  1482.             tst.l    d0
  1483.             bne    ?_Err
  1484.             moveq.l    #0,d1
  1485.             move.b    2(a1),d1
  1486.             andi.w    #$000f,d1
  1487.             add.w    d1,d1
  1488.             move.w    ?_Table(pc,d1.w),d0
  1489.             bra    ?_Quit
  1490.  
  1491.           ?_Err::
  1492.             move.l    #$700c,d0
  1493.  
  1494.           ?_Quit::
  1495.             movem.l    (sp)+,d3/a1
  1496.             rts
  1497.  
  1498.           ?_Table::
  1499.             dc.w    $0000    * 00 No Sense
  1500.             dc.w    $0001    * 01 Recovered Error
  1501.             dc.w    $7002    * 02 Not Ready
  1502.             dc.w    $7007    * 03 Medium Error
  1503.             dc.w    $700c    * 04 Hardware Error
  1504.             dc.w    $7008    * 05 Illegal Request
  1505.             dc.w    $0006    * 06 Unit Attention
  1506.             dc.w    $700d    * 07 Data Protect
  1507.             dc.w    $700c    * 08 Blank Check
  1508.             dc.w    $700c    * 09 (Bender Unique)
  1509.             dc.w    $700c    * 0A Copy Aborted
  1510.             dc.w    $700c    * 0B Aborted Command
  1511.             dc.w    $700c    * 0C Equal
  1512.             dc.w    $700c    * 0D Volume Overflow
  1513.             dc.w    $700c    * 0E Miscompare
  1514.             dc.w    $700c    * 0F (Reserve)
  1515.  
  1516.         }
  1517.  
  1518.  
  1519. *************************************************************************
  1520.  
  1521.  
  1522. *    long    SCSI_S_READ( void );
  1523. *
  1524. *        SCSIへリードコマンドを発行する。
  1525. *        EXTが使用できるかどうかどうかを自動判定する。
  1526. *        in    IOCS _S_READ(_S_READEXT)に必要なパラメータ
  1527. *        out    d0    エラーコード
  1528.  
  1529.         @xproc    [ SCSI_S_READ ] {
  1530.             @return    [ d0, ErrCode ].l;
  1531.  
  1532.             tst.b    (SCSI_WaitBusyFlag)
  1533.             @ifcl    {
  1534.                 tst.b    (SCSI_RWEXTCmdFlag)
  1535.                 @ifst    {
  1536.                     SCSI    _S_READEXT
  1537.                 } @else {
  1538.                     SCSI    _S_READ
  1539.                 }
  1540.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1541.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1542.                     move.l    d0,-(sp)
  1543.                     bsr    SCSI_S_REQUEST
  1544.                     move.l    (sp)+,d0
  1545.                 }
  1546.  
  1547.             } @else {
  1548.                 move.l    d7,-(sp)
  1549.  
  1550.                 bra    ?_Enter
  1551.               ?_Retry::
  1552.                 bsr    WaitSec
  1553.               ?_Enter::
  1554.                 tst.b    (SCSI_RWEXTCmdFlag)
  1555.                 @ifst    {
  1556.                     SCSI    _S_READEXT
  1557.                 } @else {
  1558.                     SCSI    _S_READ
  1559.                 }
  1560.                 tst.l    d0
  1561.                 beq    ?_Quit
  1562.                 cmpi.l    #SCSI_BUSYCODE,d0
  1563.                 beq    ?_Request
  1564.                 cmpi.l    #SCSI_REQCODE,d0
  1565.                 bne    ?_Quit
  1566.               ?_Request::
  1567.                 move.l    d0,d7
  1568.                 bsr    SCSI_S_REQUEST
  1569.                 tst.w    d0
  1570.                 beq    ?_Retry
  1571.                 cmpi.w    #1,d0
  1572.                 beq    ?_Retry
  1573.                 move.l    d7,d0
  1574.  
  1575.               ?_Quit::
  1576.                 move.l    (sp)+,d7
  1577.  
  1578.             }
  1579.  
  1580.             rts
  1581.  
  1582.         }
  1583.  
  1584.  
  1585. *************************************************************************
  1586.  
  1587.  
  1588. *    long    SCSI_S_WRITE( void );
  1589. *
  1590. *        SCSIへライトコマンドを発行する。
  1591. *        EXTが使用できるかどうかを自動判定する。
  1592. *        in    IOCS _S_WRITE(_S_WRITEEXT)に必要なパラメータ
  1593. *        out    d0    エラーコード
  1594.  
  1595.         @xproc    [ SCSI_S_WRITE ] {
  1596.             @return    [ d0, ErrCode ].l;
  1597.  
  1598.             tst.b    (SCSI_WaitBusyFlag)
  1599.             @ifcl    {
  1600.                 tst.b    (SCSI_RWEXTCmdFlag)
  1601.                 @ifst    {
  1602.                     SCSI    _S_WRITEEXT
  1603.                 } @else {
  1604.                     SCSI    _S_WRITE
  1605.                 }
  1606.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1607.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1608.                     move.l    d0,-(sp)
  1609.                     bsr    SCSI_S_REQUEST
  1610.                     move.l    (sp)+,d0
  1611.                 }
  1612.  
  1613.             } @else {
  1614.                 move.l    d7,-(sp)
  1615.  
  1616.                 bra    ?_Enter
  1617.               ?_Retry::
  1618.                 bsr    WaitSec
  1619.               ?_Enter::
  1620.                 tst.b    (SCSI_RWEXTCmdFlag)
  1621.                 @ifst    {
  1622.                     SCSI    _S_WRITEEXT
  1623.                 } @else {
  1624.                     SCSI    _S_WRITE
  1625.                 }
  1626.                 tst.l    d0
  1627.                 beq    ?_Quit
  1628.                 cmpi.l    #SCSI_BUSYCODE,d0
  1629.                 beq    ?_Request
  1630.                 cmpi.l    #SCSI_REQCODE,d0
  1631.                 bne    ?_Quit
  1632.               ?_Request::
  1633.                 move.l    d0,d7
  1634.                 bsr    SCSI_S_REQUEST
  1635.                 tst.w    d0
  1636.                 beq    ?_Retry
  1637.                 cmpi.w    #1,d0
  1638.                 beq    ?_Retry
  1639.                 move.l    d7,d0
  1640.  
  1641.               ?_Quit::
  1642.                 move.l    (sp)+,d7
  1643.             }
  1644.  
  1645.             rts
  1646.         }
  1647.  
  1648.  
  1649. *************************************************************************
  1650.  
  1651.  
  1652. *    long    SCSI_S_WRITEVERIFY( void );
  1653. *
  1654. *        SCSIへライト&ベリファイコマンドを発行する。
  1655. *        in    IOCS _S_WRITEVERIFYEXT(注意:ありません)に必要なパラメータ
  1656. *        out    d0    エラーコード
  1657.  
  1658.         @xproc    [ SCSI_S_WRITEVERIFY ] {
  1659.             @return    [ d0, ErrCode ].l;
  1660.  
  1661.             tst.b    (SCSI_WaitBusyFlag)
  1662.             @ifcl    {
  1663.                 bsr    ?_Cmd
  1664.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1665.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1666.                     move.l    d0,-(sp)
  1667.                     bsr    SCSI_S_REQUEST
  1668.                     move.l    (sp)+,d0
  1669.                 }
  1670.  
  1671.             } @else {
  1672.                 move.l    d7,-(sp)
  1673.  
  1674.                 bra    ?_Enter
  1675.               ?_Retry::
  1676.                 bsr    WaitSec
  1677.               ?_Enter::
  1678.                 bsr    ?_Cmd
  1679.                 tst.l    d0
  1680.                 beq    ?_Quit
  1681.                 cmpi.l    #SCSI_BUSYCODE,d0
  1682.                 beq    ?_Request
  1683.                 cmpi.l    #SCSI_REQCODE,d0
  1684.                 bne    ?_Quit
  1685.               ?_Request::
  1686.                 move.l    d0,d7
  1687.                 bsr    SCSI_S_REQUEST
  1688.                 tst.w    d0
  1689.                 beq    ?_Retry
  1690.                 cmpi.w    #1,d0
  1691.                 beq    ?_Retry
  1692.                 move.l    d7,d0
  1693.  
  1694.               ?_Quit::
  1695.                 move.l    (sp)+,d7
  1696.             }
  1697.  
  1698.             rts
  1699.  
  1700.           ?_Cmd::
  1701.             lea    ?_Data(pc),a0
  1702.             move.l    d2,2(a0)
  1703.             move.w    d3,-(sp)
  1704.             move.b    (sp)+,7(a0)
  1705.             move.b    d3,8(a0)
  1706.  
  1707.             pea    SCSI_DATABuf
  1708.             clr.l    -(sp)
  1709.             move.l    a1,-(sp)
  1710.             moveq.l    #0,d0
  1711.             move.w    d3,d0
  1712.             lsl.l    d5,d0
  1713.             lsl.l    #8,d0
  1714.             move.l    d0,-(sp)
  1715.             pea    ?_Data(pc)
  1716.             move.l    #10,-(sp)
  1717.             bsr    SCSI_SELECT
  1718.             lea    24(sp),sp
  1719.             rts
  1720.  
  1721.           ?_Data::
  1722.             dc.b    $2e,$00
  1723.             dc.b    $00,$00,$00,$00
  1724.             dc.b    $00
  1725.             dc.b    $00,$00
  1726.             dc.b    $00
  1727.             .even
  1728.  
  1729.         }
  1730.  
  1731.  
  1732. *************************************************************************
  1733.  
  1734.  
  1735. *    long    SCSI_S_VERIFY( void );
  1736. *
  1737. *        SCSIへベリファイコマンドを発行する。
  1738. *        in    IOCS _S_VERIFYに必要なパラメータ
  1739. *        out    d0    エラーコード
  1740.  
  1741.         @xproc    [ SCSI_S_VERIFY ] {
  1742.             @return    [ d0, ErrCode ].l;
  1743.  
  1744.             tst.b    (SCSI_WaitBusyFlag)
  1745.             @ifcl    {
  1746.                 SCSI    _S_VERIFY
  1747.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1748.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1749.                     move.l    d0,-(sp)
  1750.                     bsr    SCSI_S_REQUEST
  1751.                     move.l    (sp)+,d0
  1752.                 }
  1753.  
  1754.             } @else {
  1755.                 move.l    d7,-(sp)
  1756.  
  1757.                 bra    ?_Enter
  1758.               ?_Retry::
  1759.                 bsr    WaitSec
  1760.               ?_Enter::
  1761.                 SCSI    _S_VERIFY
  1762.                 tst.l    d0
  1763.                 beq    ?_Quit
  1764.                 cmpi.l    #SCSI_BUSYCODE,d0
  1765.                 beq    ?_Request
  1766.                 cmpi.l    #SCSI_REQCODE,d0
  1767.                 bne    ?_Quit
  1768.               ?_Request::
  1769.                 move.l    d0,d7
  1770.                 bsr    SCSI_S_REQUEST
  1771.                 tst.w    d0
  1772.                 beq    ?_Retry
  1773.                 cmpi.w    #1,d0
  1774.                 beq    ?_Retry
  1775.                 move.l    d7,d0
  1776.  
  1777.               ?_Quit::
  1778.                 move.l    (sp)+,d7
  1779.             }
  1780.  
  1781.             rts
  1782.         }
  1783.  
  1784.  
  1785. *************************************************************************
  1786.  
  1787.  
  1788. *    long    SCSI_SELECT( void );
  1789. *
  1790. *        SCSIコマンド処理を行なう。
  1791. *        in    0(sp)    出力コマンドバイト数
  1792. *            4(sp)    出力コマンドへのポインタ
  1793. *            8(sp)    出力データバイト数
  1794. *            12(sp)    出力データへのポインタ
  1795. *            16(sp)    入力データバイト数
  1796. *            20(sp)    入力データへのポインタ
  1797. *        out    d0    エラーコード
  1798.  
  1799.         @xproc    [ SCSI_SELECT ] {
  1800.             @return    [ d0, ErrCode ].l;
  1801.  
  1802.             movem.l    d1-d7/a0-a6,-(sp)
  1803.  
  1804.             clr.w    (?_RetryCount)
  1805.           ?_Retry::
  1806.  
  1807.             lea    15*4(sp),a0
  1808.             move.l    (SCSI_ID),d4
  1809.             andi.l    #$0007ffff,d4
  1810.  
  1811.             move.b    (SCSI_Version),d0
  1812.             andi.b    #$07,d0
  1813.             cmpi.b    #2,d0
  1814.             @ifcc    {
  1815.  
  1816.                 * SCSI-2
  1817.                 move.l    (SCSI_ID),d0
  1818.                 swap    d0
  1819.                 cmpi.b    #8,d0
  1820.                 @ifcs    {
  1821.                   ?_Select_SCSI2_LUN::
  1822.                     @repeat [ d3, #6-1 ].q {
  1823.                         SCSI    _S_SELECT2
  1824.                         tst.l    d0
  1825.                         beq    ?_Select_e_SCSI2_LUN
  1826.                     }
  1827.                     bra    ?_Err
  1828.                   ?_Select_e_SCSI2_LUN::
  1829.  
  1830.                   ?_MessageOut::
  1831.                     move.l    (SCSI_ID),d0
  1832.                     swap    d0
  1833.                     lea    ?_MessageOutBuf(pc),a1
  1834.                     ori.b    #$80,d0
  1835.                     move.b    d0,(a1)
  1836.                     SCSI    _S_MSGOUT
  1837.                     tst.l    d0
  1838.                     bmi    ?_Err
  1839.                 } @else {
  1840.                   ?_Select_SCSI2::
  1841.                     @repeat [ d3, #6-1 ].q {
  1842.                         SCSI    _S_SELECT
  1843.                         tst.l    d0
  1844.                         beq    ?_Select_e_SCSI2
  1845.                     }
  1846.                     bra    ?_Err
  1847.                   ?_Select_e_SCSI2::
  1848.  
  1849.                 }
  1850.  
  1851.               ?_CmdOut_SCSI2::
  1852.                 movem.l    0(a0),d3/a1
  1853.                 SCSI    _S_CMDOUT
  1854.                 tst.l    d0
  1855.                 bmi    ?_Err
  1856.  
  1857.             } @else {
  1858.  
  1859.                 * SCSI-1
  1860.               ?_Select_SCSI1::
  1861.                 @repeat [ d3, #6-1 ].q {
  1862.                     SCSI    _S_SELECT
  1863.                     tst.l    d0
  1864.                     beq    ?_Select_e_SCSI1
  1865.                 }
  1866.                 bra    ?_Err
  1867.               ?_Select_e_SCSI1::
  1868.  
  1869.               ?_CmdOut_SCSI1::
  1870.                 movem.l    0(a0),d3/a1
  1871.                 move.l    (SCSI_ID),d0
  1872.                 swap    d0
  1873.                 lsl.b    #5,d0
  1874.                 move.b    1(a1),d1
  1875.                 andi.b    #$1f,d1
  1876.                 or.b    d0,d1
  1877.                 move.b    d1,1(a1)
  1878.  
  1879.                 SCSI    _S_CMDOUT
  1880.                 tst.l    d0
  1881.                 bmi    ?_Err
  1882.  
  1883.             }
  1884.  
  1885.           ?_DataOut::
  1886.             move.l    8(a0),d3
  1887.             beq    ?_DataIn
  1888.             move.l    12(a0),a1
  1889.             SCSI    _S_DATAOUT
  1890.             move.l    d0,d6
  1891.             cmpi.l    #-1,d0
  1892.             beq    ?_Err
  1893.  
  1894.           ?_DataIn::
  1895.             move.l    16(a0),d3
  1896.             beq    ?_StatusIn
  1897.             move.l    20(a0),a1
  1898.             SCSI    _S_DATAIN
  1899.             move.l    d0,d6
  1900.             cmpi.l    #-1,d0
  1901.             beq    ?_Err
  1902.  
  1903.           ?_StatusIn::
  1904.             lea    ?_StatusInBuf(pc),a1
  1905.             SCSI    _S_STSIN
  1906.             cmpi.l    #-1,d0
  1907.             beq    ?_Err
  1908.  
  1909.           ?_MessageIn::
  1910.             lea    ?_MessageInBuf(pc),a1
  1911.             SCSI    _S_MSGIN
  1912.             cmpi.l    #-1,d0
  1913.             beq    ?_Err
  1914.  
  1915.             tst.l    d6
  1916.             bne    ?_Err2
  1917.  
  1918.             move.l    ?_DataBuf(pc),d0
  1919.             @ifne    {
  1920.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1921.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1922.                     move.l    d0,d7
  1923.                     bsr    SCSI_S_REQUEST
  1924.                     cmpi.w    #6,d0
  1925.                     @ifeq    {
  1926.                         bsr    SCSI_S_SETFLAG
  1927.                         bra    ?_Quit
  1928.                     }
  1929.                     tst.b    (SCSI_WaitBusyFlag)
  1930.                     @ifst    {
  1931.                         tst.w    d0
  1932.                         beq    ?_Quit
  1933.                         cmpi.w    #1,d0
  1934.                         beq    ?_Quit
  1935.                     }
  1936.                     move.l    d7,d0
  1937.                 }
  1938.                 bsr    SCSI_S_SETFLAG
  1939.                 st.b    (RealEjectedFlag)
  1940.             }
  1941.  
  1942.           ?_Quit::
  1943.             movem.l    (sp)+,d1-d7/a0-a6
  1944.             rts
  1945.  
  1946.           ?_Err::
  1947.             moveq.l    #-1,d0
  1948.             bsr    SCSI_S_SETFLAG
  1949.             st.b    (RealEjectedFlag)
  1950.             bra    ?_Quit
  1951.  
  1952.           ?_Err2::
  1953.             addq.w    #1,(?_RetryCount)
  1954.             cmpi.w    #6+1,(?_RetryCount)
  1955.             bcs    ?_Retry
  1956.             move.l    d6,d0
  1957.             @ifpl    {
  1958.                 move.l    ?_DataBuf(pc),d0
  1959.             }
  1960.             bsr    SCSI_S_SETFLAG
  1961.             st.b    (RealEjectedFlag)
  1962.             bra    ?_Quit
  1963.  
  1964.           ?_RetryCount::
  1965.             dc.w    0
  1966.           ?_MessageOutBuf::
  1967.             dc.b    0
  1968.             dc.b    0
  1969.           ?_DataBuf::
  1970.             dc.b    0
  1971.           ?_MessageInBuf::
  1972.             dc.b    0
  1973.             dc.b    0
  1974.           ?_StatusInBuf::
  1975.             dc.b    0
  1976.  
  1977.         }
  1978.  
  1979.  
  1980. *************************************************************************
  1981.  
  1982.  
  1983. GetPhysicalCDROM1Sector::
  1984.         moveq.l    #1,d0
  1985.         cmpi.l    #16,d2
  1986.         @ifcs    {
  1987.             rts
  1988.         }
  1989.         move.w    (CDROM_SectorSize),d0
  1990.         @ifne    {
  1991.             cmpi.w    #2048,d0
  1992.             @ifls    {
  1993.                 move.l    #2048,d0
  1994.                 divu    (CDROM_SectorSize),d0
  1995.             }
  1996.         }
  1997.         rts
  1998.  
  1999. ConvertCDROMSector::
  2000.         cmpi.l    #16,d2
  2001.         @ifls    {
  2002.             rts
  2003.         }
  2004.         move.w    (CDROM_SectorSize),d0
  2005.         @ifne    {
  2006.             cmpi.w    #2048,d0
  2007.             @ifls    {
  2008.                 move.l    #2048,d0
  2009.                 divu    (CDROM_SectorSize),d0
  2010.                 @while [ lsr.w #1,d0 ].ne {
  2011.                     lsr.l    #1,d2
  2012.                 }
  2013.             } @else {
  2014.                 * 正常動作しないはず
  2015.                 divu    #2048,d0
  2016.                 @while [ lsr.w #1,d0 ].ne {
  2017.                     lsl.l    #1,d2
  2018.                 }
  2019.             }
  2020.         }
  2021.         rts
  2022.  
  2023. ConvertCDROMCacheAddress::
  2024.         cmpi.l    #16,d2
  2025.         @ifcs    {
  2026.             rts
  2027.         }
  2028.         movem.l    d0/d1,-(sp)
  2029.         move.w    (CDROM_SectorSize),d0
  2030.         @ifne    {
  2031.             cmpi.w    #2048,d0
  2032.             @ifls    {
  2033.                 move.l    #2048,d0
  2034.                 divu    (CDROM_SectorSize),d0
  2035.                 ext.l    d0
  2036.                 subq.l    #1,d0
  2037.                 move.l    d2,d1
  2038.                 and.l    d0,d1
  2039.                 mulu    (CDROM_SectorSize),d1
  2040.                 add.l    d1,a1
  2041.             } @else {
  2042.                 * 正常動作しない
  2043.             }
  2044.         }
  2045.         movem.l    (sp)+,d0/d1
  2046.         rts
  2047.  
  2048.  
  2049. *************************************************************************
  2050.  
  2051.  
  2052. *    long    ReadCDROM( void );
  2053. *
  2054. *        CD-ROMリードルーチン。
  2055. *        in    d2    セクタ番号
  2056. *            d3    セクタ数
  2057. *            a1    リードバッファへのポインタ
  2058. *        out    d0    エラーコード
  2059.  
  2060.  
  2061.         @xproc    [ ReadCDROM ] {
  2062.             @return    [ d0, ErrCode ].l;
  2063.  
  2064.             movem.l    d1-d7/a0-a6,-(sp)
  2065.  
  2066.           ?_Entry::
  2067.             move.l    (SCSI_ID),d4
  2068.             andi.l    #$0007ffff,d4
  2069.             moveq.l    #0,d5
  2070.             move.b    (SCSI_BlockCapacity),d5
  2071.             move.l    d3,d6
  2072.           ?_lp::
  2073.             move.l    #76,d3    * CDROM1秒
  2074.             cmp.l    d6,d3
  2075.             @ifcc    {
  2076.                 move.l    d6,d3
  2077.             }
  2078.             clr.b    (RetryFlag)
  2079.           ?_Retrylp::
  2080.             bsr    SCSI_S_READ
  2081.             tst.l    d0
  2082.             bmi    ?_Err_Unconnect
  2083.             bne    ?_Retry
  2084.  
  2085.           ?_Next::
  2086.             sub.l    d3,d6
  2087.             @ifne    {
  2088.                 add.l    d3,d2
  2089.                 mulu    #$800,d3
  2090.                 add.l    d3,a1
  2091.                 bra    ?_lp
  2092.             }
  2093.  
  2094.             bsr    GetTime
  2095.             move.l    d0,(LastAccessTime)
  2096.             move.l    d1,(LastAccessDate)
  2097.             clr.b    (ReqAskSCSIConnect)
  2098.             moveq.l    #0,d0
  2099.             bra    ?_Quit
  2100.  
  2101.           ?_Retry::
  2102.             cmpi.b    #RETRYCOUNT,(RetryFlag)
  2103.             bcc    ?_Err_Read
  2104.             addq.b    #1,(RetryFlag)
  2105.             bsr    SCSI_S_SETFLAG
  2106.             bra    ?_Retrylp
  2107.  
  2108.           ?_Err_Media::
  2109.             move.w    #$7007,d0    *無効なメディア,ARI
  2110.             bra    ?_Quit
  2111.  
  2112.           ?_Err_Unconnect::
  2113.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2114.             bra    ?_Quit
  2115.  
  2116.           ?_Err_Read::
  2117.             move.w    #$700b,d0    *読み込みエラー,ARI
  2118.             lea    SCSI_REQUESTBuf,a1
  2119.             move.b    2(a1),d1
  2120.             andi.b    #$0f,d1
  2121.             @switch [ d1 ].b {
  2122.               @case    #$02:    * $02 Not Ready
  2123.                 move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2124.                 @break;
  2125.             }
  2126.             bra    ?_Quit
  2127.  
  2128.           ?_Err_UnitNo::
  2129.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2130.             bra    ?_Quit
  2131.  
  2132.           ?_Quit::
  2133.             tst.w    d0
  2134.             @ifne    {
  2135.                 bsr    SCSI_S_SETFLAG
  2136.             }
  2137.             movem.l    (sp)+,d1-d7/a0-a6
  2138.             rts
  2139.  
  2140.         }
  2141.  
  2142.  
  2143. *************************************************************************
  2144.  
  2145.  
  2146. *    long    FlushCDROMCache( void );
  2147. *
  2148. *        CD-ROMキャッシュクリア。
  2149. *        in    なし
  2150. *        out    なし
  2151.  
  2152.  
  2153.         @xproc    [ FlushCDROMCache ] {
  2154.             @return    [ d0, ErrCode ].l;
  2155.  
  2156.             movem.l    d1-d7/a0-a6,-(sp)
  2157.  
  2158.           ?_Entry::
  2159.             moveq.l    #-1,d0
  2160.             lea    CDROMSecNoTable,a0
  2161.             move.w    (CDROMCacheBufSize),d7
  2162.             subq.w    #1,d7
  2163.             @repeat [ d7 ].w {
  2164.                 move.l    d0,(a0)+
  2165.             }
  2166.             moveq.l    #0,d0
  2167.  
  2168.           ?_Quit::
  2169.             movem.l    (sp)+,d1-d7/a0-a6
  2170.             rts
  2171.  
  2172.  
  2173.         }
  2174.  
  2175.  
  2176. *************************************************************************
  2177.  
  2178.  
  2179. *    long    ReadCDROMCache( void );
  2180. *
  2181. *        キャッシュ付きCD-ROMリードルーチン。
  2182. *        in    d1    0でデータ、1でディレクトリ階層
  2183. *            d2    セクタ番号
  2184. *        out    d0    エラーコード
  2185. *            a1    リードデータへのポインタ
  2186.  
  2187.  
  2188.         @xproc    [ ReadCDROMCache ] {
  2189.             @return    [ d0, ErrCode ].l;
  2190.  
  2191.             movem.l    d1-d7/a0/a2-a6,-(sp)
  2192.             move.l    d2,-(sp)
  2193.             bsr    ConvertCDROMSector
  2194.  
  2195.           ?_Entry::
  2196.             moveq.l    #0,d7
  2197.             @do {
  2198.                 move.w    d7,d0
  2199.                 mulu    #4,d0
  2200.                 lea    CDROMSecNoTable,a0
  2201.                 add.l    d0,a0
  2202.                 move.l    (a0),d0
  2203.                 @ifpl    {
  2204.                     cmp.l    d0,d2
  2205.                     beq    ?_OkCache
  2206.                 }
  2207.                 addq.w    #1,d7
  2208.                 cmp.w    (CDROMCacheBufSize),d7
  2209.             } @while.cs;
  2210.  
  2211.             lea    CDROMSecNoTable,a0
  2212.             moveq.l    #0,d7
  2213.             tst.b    d1
  2214.             @ifne    {
  2215.                 move.l    (CDROMCacheIndex),d7
  2216.                 addq.w    #1,d7
  2217.                 cmp.w    (CDROMCacheBufSize),d7
  2218.                 @ifcc    {
  2219.                     move.w    (CDROMCacheBufSize),d7
  2220.                     subq.w    #1,d7
  2221.                 }
  2222.             }
  2223.             move.w    d7,d0
  2224.             mulu    #4,d0
  2225.             add.l    d0,a0
  2226.  
  2227.           ?_NoCache::
  2228.             move.l    #-1,(a0)
  2229.             moveq.l    #1,d3
  2230.             lea    CDROMCacheBuf,a1
  2231.             move.w    d7,d0
  2232.             mulu    #2048,d0
  2233.             add.l    d0,a1
  2234.             bsr    ReadCDROM
  2235.             tst.l    d0
  2236.             @ifeq    {
  2237.                 move.l    d2,(a0)
  2238.                 tst.b    d1
  2239.                 @ifne    {
  2240.                     move.l    d7,(CDROMCacheIndex)
  2241.                 }
  2242.             }
  2243.             bra    ?_Quit
  2244.  
  2245.           ?_OkCache::
  2246.             lea    CDROMCacheBuf,a1
  2247.             moveq.l    #0,d0
  2248.             move.w    d7,d0
  2249.             move.l    d0,(CDROMCacheIndex)
  2250.             mulu    #2048,d0
  2251.             add.l    d0,a1
  2252.             moveq.l    #0,d0
  2253.  
  2254.           ?_Quit::
  2255.             move.l    (sp)+,d2
  2256.             bsr    ConvertCDROMCacheAddress
  2257.             movem.l    (sp)+,d1-d7/a0/a2-a6
  2258.             rts
  2259.  
  2260.         }
  2261.  
  2262.  
  2263. *************************************************************************
  2264.  
  2265.  
  2266. *    long    GetTime( void );
  2267. *
  2268. *        現在の起動後時間を得る。
  2269. *        IOCS _ONTIMEコンパチ。
  2270. *        in    なし
  2271. *        out    d0    経過時間
  2272. *            d1    経過日数
  2273.  
  2274.         @xproc    [ GetTime ] {
  2275.             @return    [ d0, Time ].l;
  2276.             @return    [ d1, Date ].l;
  2277.  
  2278.             move.w    sr,-(sp)
  2279.             ori.w    #$700,sr
  2280.             move.l    ($09d6.w),d1
  2281.             cmp.l    #$05A00000,D1
  2282.             @ifcc    {
  2283.                 moveq.l    #0,d1
  2284.             }
  2285.             divu    #$05A0,D1
  2286.             move.w    d1,-(sp)
  2287.             swap    d1
  2288.             mulu    #$1770,d1
  2289.             moveq.l    #0,d0
  2290.             move.w    ($09ca.w),d0
  2291.             sub.w    ($09cc.w),d0
  2292.             add.l    d1,d0
  2293.             moveq.l    #0,d1
  2294.             move.w    (sp)+,d1
  2295.             move.w    (sp)+,sr
  2296.  
  2297.             rts
  2298.         }
  2299.  
  2300.  
  2301. *************************************************************************
  2302.  
  2303.  
  2304. *    long    AskExchangeMedia( void );
  2305. *
  2306. *        メディア交換をチェックする。
  2307. *        in    なし
  2308. *        out    d0    0で交換なし
  2309.  
  2310.  
  2311.         @xproc    [ AskExchangeMedia ] {
  2312.             @return    [ d0, ErrCode ].l;
  2313.  
  2314.             movem.l    d1-d7/a0-a6,-(sp)
  2315.  
  2316.           ?_Entry::
  2317.             st.b    (RealEjectedFlag)
  2318.             tst.b    (ForceEjectFlag)
  2319.             bst    ?_Change
  2320.             clr.b    (RealEjectedFlag)
  2321.             clr.b    (ReqAskSCSIConnect)
  2322.  
  2323.               bra    ?_EnterTestUnit
  2324.           ?_RetryTestUnit::
  2325.             bsr    WaitSec
  2326.           ?_EnterTestUnit::
  2327.             move.l    (SCSI_ID),d4
  2328.             andi.l    #$0007ffff,d4
  2329.             SCSI    _S_TESTUNIT
  2330.             tst.l    d0
  2331.             @ifmi    {
  2332.                 st.b    (ReqAskSCSIConnect)
  2333.                 st.b    (RealEjectedFlag)
  2334.                 bra    ?_Change
  2335.             }
  2336.             tst.l    d0
  2337.             @ifne    {
  2338.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  2339.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  2340.                     move.l    d0,d7
  2341.                     bsr    SCSI_S_REQUEST
  2342.                     cmpi.w    #6,d0
  2343.                     @ifeq    {
  2344.                         bsr    SCSI_S_SETFLAG
  2345.                         bra    ?_RetryTestUnit
  2346.                     }
  2347.                     tst.b    (SCSI_WaitBusyFlag)
  2348.                     @ifst    {
  2349.                         tst.w    d0
  2350.                         beq    ?_OKTestUnit
  2351.                         cmpi.w    #1,d0
  2352.                         beq    ?_OKTestUnit
  2353.                     }
  2354.                     move.l    d7,d0
  2355.                 }
  2356.                 st.b    (RealEjectedFlag)
  2357.                 bra    ?_Change
  2358.             }
  2359.           ?_OKTestUnit::
  2360.  
  2361.               bra    ?_EnterInquiry
  2362.           ?_RetryInquiry::
  2363.             bsr    WaitSec
  2364.           ?_EnterInquiry::
  2365.             lea    SCSI_INQUIRYBuf,a1
  2366.             move.l    #$24,d3
  2367.             SCSI    _S_INQUIRY
  2368.             tst.l    d0
  2369.             @ifne    {
  2370.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  2371.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  2372.                     move.l    d0,d7
  2373.                     bsr    SCSI_S_REQUEST
  2374.                     cmpi.w    #6,d0
  2375.                     @ifeq    {
  2376.                         bsr    SCSI_S_SETFLAG
  2377.                         bra    ?_RetryTestUnit    * 再認識
  2378.                     }
  2379.                     tst.b    (SCSI_WaitBusyFlag)
  2380.                     @ifst    {
  2381.                         tst.w    d0
  2382.                         beq    ?_OKInquiry
  2383.                         cmpi.w    #1,d0
  2384.                         beq    ?_OKInquiry
  2385.                     }
  2386.                     move.l    d7,d0
  2387.                 }
  2388.                 clr.b    (SCSI_RemovableFlag)
  2389.                 st.b    (RealEjectedFlag)
  2390.                 bra    ?_Change
  2391.             }
  2392.           ?_OKInquiry::
  2393.             move.b    2(a1),(SCSI_Version)
  2394.             move.b    0(a1),d0
  2395.             andi.b    #$1f,d0
  2396.             move.b    d0,(SCSI_DeviceType)
  2397.             tst.b    1(a1)
  2398.             smi    (SCSI_RemovableFlag)
  2399.  
  2400.               bra    ?_EnterModeSense
  2401.           ?_RetryModeSense::
  2402.             bsr    WaitSec
  2403.           ?_EnterModeSense::
  2404.             lea    SCSI_MODESENSEBuf,a1
  2405.             moveq.l    #$3f,d2
  2406.             moveq.l    #32,d3
  2407.             moveq.l    #0,d5
  2408.             move.b    (SCSI_BlockCapacity),d5
  2409.             SCSI    _S_MODESENSE
  2410.             tst.l    d0
  2411.             @ifne    {
  2412.                 @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  2413.                     [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  2414.                     move.l    d0,d7
  2415.                     bsr    SCSI_S_REQUEST
  2416.                     cmpi.w    #6,d0
  2417.                     @ifeq    {
  2418.                         bsr    SCSI_S_SETFLAG
  2419.                         bra    ?_RetryTestUnit    * 再認識
  2420.                     }
  2421.                     tst.b    (SCSI_WaitBusyFlag)
  2422.                     @ifst    {
  2423.                         tst.w    d0
  2424.                         beq    ?_OKModeSense
  2425.                         cmpi.w    #1,d0
  2426.                         beq    ?_OKModeSense
  2427.                         move.l    d7,d0
  2428.                     }
  2429.                 }
  2430.                 clr.b    (SCSI_WriteProtectFlag)
  2431.                 st.b    (RealEjectedFlag)
  2432.                 bra    ?_Change
  2433.             }
  2434.           ?_OKModeSense::
  2435.             tst.b    2(a1)
  2436.             smi    (SCSI_WriteProtectFlag)
  2437.  
  2438.             move.w    (SDDMode),d0
  2439.             @switch [ d0 ].w {
  2440.               @case    #1:
  2441.                 st.b    (SCSI_WriteProtectFlag)
  2442.                 @break;
  2443.             }
  2444.  
  2445.             tst.b    (ForceProtectFlag)
  2446.             @ifst    {
  2447.                 st.b    (SCSI_WriteProtectFlag)
  2448.             }
  2449.  
  2450.             tst.b    (ReqRemakeDPB)
  2451.             bcl    ?_Unchange
  2452.  
  2453.           ?_Change::
  2454.             bsr    SCSI_S_SETFLAG
  2455.             moveq.l    #-1,d0
  2456.             bra    ?_e
  2457.  
  2458.           ?_Unchange::
  2459.             moveq.l    #1,d0
  2460.             bra    ?_e
  2461.  
  2462.           ?_e::
  2463.             movem.l    (sp)+,d1-d7/a0-a6
  2464.             rts
  2465.         }
  2466.  
  2467.  
  2468. *************************************************************************
  2469.  
  2470.  
  2471. *    long    AskExchangeMedia_Time( void );
  2472. *
  2473. *        メディア挿入時は(SpOption_TEJ)秒ごとに、
  2474. *        メディア非挿入時は(SpOption_TIN)秒ごとに、
  2475. *        メディア交換をチェックする。
  2476. *        in    a5    リクエストヘッダ
  2477. *                REQH_Magic00        常に26
  2478. *                REQH_UnitNo        ユニット番号
  2479. *        out    d0    エラーコード
  2480.  
  2481.  
  2482.         @xproc    [ AskExchangeMedia_Time ] {
  2483.             @return    [ d0, ErrCode ].l;
  2484.  
  2485.             movem.l    d1-d7/a0-a6,-(sp)
  2486.  
  2487.           ?_Entry::
  2488.             bsr    GetTime
  2489.             move.l    (LastAccessTime),d2
  2490.             move.l    (LastAccessDate),d3
  2491.             sub.l    d3,d1
  2492.             @ifne    {
  2493.                 add.l    #8640000,d0
  2494.             }
  2495.             sub.l    d2,d0
  2496.             tst.b    (ReqRemakeDPB)
  2497.             @ifst    {
  2498.                 cmp.l    (SpOption_TIN),d0
  2499.             } @else {
  2500.                 cmp.l    (SpOption_TEJ),d0
  2501.             }
  2502.             bcs    ?_Unchange
  2503.             bsr    AskExchangeMedia
  2504.             move.l    d0,-(sp)
  2505.             bsr    GetTime
  2506.             move.l    d0,(LastAccessTime)
  2507.             move.l    d1,(LastAccessDate)
  2508.             move.l    (sp)+,d0
  2509.             bra    ?_e
  2510.  
  2511.           ?_Unchange::
  2512.             moveq.l    #1,d0
  2513.  
  2514.           ?_e::
  2515.             moveq.l    #0,d0
  2516.  
  2517.             movem.l    (sp)+,d1-d7/a0-a6
  2518.             rts
  2519.         }
  2520.  
  2521.  
  2522. *************************************************************************
  2523.  
  2524.  
  2525. *    long    WaitSec( void );
  2526. *
  2527. *        (SpOption_TWA)秒待つ。
  2528. *        in    なし
  2529. *        out    なし
  2530.  
  2531.  
  2532.         @xproc    [ WaitSec ] {
  2533.             movem.l    d0-d3,-(sp)
  2534.  
  2535.             bsr    GetTime
  2536.             move.l    d0,d2
  2537.             move.l    d1,d3
  2538.             @do {
  2539.                 bsr    GetTime
  2540.                 sub.l    d3,d1
  2541.                 @ifne    {
  2542.                     add.l    #8640000,d0
  2543.                 }
  2544.                 sub.l    d2,d0
  2545.                 cmp.l    (SpOption_TWA),d0
  2546.             } @while.cs;
  2547.  
  2548.             movem.l    (sp)+,d0-d3
  2549.             rts
  2550.         }
  2551.  
  2552.  
  2553. *************************************************************************
  2554.  
  2555.  
  2556. *    long    ReadSec( void );
  2557. *
  2558. *        セクタを読み込む。
  2559. *        in    a5    リクエストヘッダ
  2560. *                REQH_Magic00        常に26
  2561. *                REQH_UnitNo        ユニット番号
  2562. *                REQH_MediaID        メディアバイト
  2563. *                REQH_DataBufferPtr    データバッファへのポインタ
  2564. *                REQH_SecNum        セクタ数
  2565. *                REQH_Sec        開始セクタ番号
  2566. *        out    d0    エラーコード
  2567.  
  2568.  
  2569.         @xproc    [ ReadSec ] {
  2570.             @return    [ d0, ErrCode ].l;
  2571.  
  2572.             movem.l    d1-d7/a0-a6,-(sp)
  2573.  
  2574.           ?_Entry::
  2575.             clr.b    (RetryFlag)
  2576.           ?_Retrylp::
  2577.             tst.b    (ReqRemakeDPB)
  2578.             @ifst    {
  2579.                 bsr    RemakeDPB
  2580.                 cmpi.w    #$0300,(HumanVersion)
  2581.                 @ifcc    {
  2582.                     st.b    (ReqRemakeDPB)
  2583.                     st.b    (ReqSendRezeroUnit)
  2584.                 }
  2585.                 tst.b    (ReqAskSCSIConnect)
  2586.                 bst    ?_Err_Unconnect
  2587.             }
  2588.             moveq.l    #0,d1
  2589.             move.b    REQH_UnitNo(a5),d1
  2590.             cmp.b    (DPBMaxCount),d1
  2591.             bcc    ?_Err_UnitNo
  2592.             tst.w    (FormatType)
  2593.             bmi    ?_Err_UnitNo
  2594.             tst.b    (RealEjectedFlag)
  2595.             bst    ?_Err_Unconnect
  2596.  
  2597.             move.w    (FormatType),d0
  2598.             @switch [ d0 ].w {
  2599.               @case #SDD_FormatType_ISO9660:
  2600.                 moveq.l    #0,d6
  2601.                 moveq.l    #0,d7
  2602.                 @break;
  2603.               @default:
  2604.                 lea    DPBTable,a0
  2605.                 mulu    #SizeOf1DPBTable,d1
  2606.                 move.l    DPBTable_XDPBPtr(a0,d1.w),d0
  2607.                 beq    ?_Err_UnitNo
  2608.                 move.l    d0,a3
  2609.                 move.l    DPBTable_BaseSec(a0,d1.w),d6
  2610.                 move.w    DPBTable_Sft(a0,d1.w),d7
  2611.                 @break;
  2612.             }
  2613.  
  2614.             move.l    REQH_Sec(a5),d2
  2615.             move.l    REQH_SecNum(a5),d3
  2616.             lsl.l    d7,d2
  2617.             lsl.l    d7,d3
  2618.             add.l    d6,d2
  2619.             move.l    d3,d6
  2620.  
  2621.             move.l    REQH_DataBufferPtr(a5),a1
  2622.             move.l    (SCSI_ID),d4
  2623.             andi.l    #$0007ffff,d4
  2624.             moveq.l    #0,d5
  2625.             move.b    (SCSI_BlockCapacity),d5
  2626.           ?_lp::
  2627.             move.l    (DivideAccessSize),d3
  2628.             cmp.l    d3,d6
  2629.             @ifcs    {
  2630.                 move.l    d6,d3
  2631.             }
  2632.             bsr    SCSI_S_READ
  2633.             tst.l    d0
  2634.             bmi    ?_Err_Unconnect
  2635.             bne    ?_Retry
  2636.             sub.l    d3,d6
  2637.             @ifne    {
  2638.                 move.w    (SCSI_BlockCapacityByte),d0
  2639.                 mulu    d3,d0
  2640.                 adda.l    d0,a1
  2641.                 add.l    d3,d2
  2642.                 bra    ?_lp
  2643.             }
  2644.  
  2645.             bsr    GetTime
  2646.             move.l    d0,(LastAccessTime)
  2647.             move.l    d1,(LastAccessDate)
  2648.             clr.b    (ReqAskSCSIConnect)
  2649.             moveq.l    #0,d0
  2650.             bra    ?_Quit
  2651.  
  2652.           ?_Retry::
  2653.             cmpi.b    #RETRYCOUNT,(RetryFlag)
  2654.             bcc    ?_Err_Read
  2655.             addq.b    #1,(RetryFlag)
  2656.             bsr    SCSI_S_SETFLAG
  2657.             bra    ?_Retrylp
  2658.  
  2659.           ?_Err_Media::
  2660.             move.w    #$7007,d0    *無効なメディア,ARI
  2661.             bra    ?_Quit
  2662.  
  2663.           ?_Err_Unconnect::
  2664.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2665.             bra    ?_Quit
  2666.  
  2667.           ?_Err_Read::
  2668.             move.w    #$700b,d0    *読み込みエラー,ARI
  2669.             lea    SCSI_REQUESTBuf,a1
  2670.             move.b    2(a1),d1
  2671.             andi.b    #$0f,d1
  2672.             @switch [ d1 ].b {
  2673.               @case    #$02:    * $02 Not Ready
  2674.                 move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2675.                 @break;
  2676.             }
  2677.             bra    ?_Quit
  2678.  
  2679.           ?_Err_UnitNo::
  2680.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2681.             bra    ?_Quit
  2682.  
  2683.           ?_Quit::
  2684.             tst.w    d0
  2685.             @ifne    {
  2686.                 bsr    SCSI_S_SETFLAG
  2687.             }
  2688.             movem.l    (sp)+,d1-d7/a0-a6
  2689.             rts
  2690.         }
  2691.  
  2692.  
  2693. *************************************************************************
  2694.  
  2695.  
  2696. *    long    WriteSec( void );
  2697. *
  2698. *        セクタに書き込む。
  2699. *        in    a5    リクエストヘッダ
  2700. *                REQH_Magic00        常に26
  2701. *                REQH_UnitNo        ユニット番号
  2702. *                REQH_MediaID        メディアバイト
  2703. *                REQH_DataBufferPtr    データバッファへのポインタ
  2704. *                REQH_SecNum        セクタ数
  2705. *                REQH_Sec        開始セクタ番号
  2706. *        out    d0    エラーコード
  2707.  
  2708.  
  2709.         @xproc    [ WriteSec ] {
  2710.             @return    [ d0, ErrCode ].l;
  2711.  
  2712.  .if CANNOTWRITE
  2713.  
  2714.     rts
  2715.  
  2716.  .else
  2717.  
  2718.             movem.l    d1-d7/a0-a6,-(sp)
  2719.  
  2720.           ?_Entry::
  2721.             clr.b    (RetryFlag)
  2722.           ?_Retrylp::
  2723.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  2724.             tst.b    (ReqRemakeDPB)
  2725.             @ifst    {
  2726.                 bsr    RemakeDPB
  2727.                 cmpi.w    #$0300,(HumanVersion)
  2728.                 @ifcc    {
  2729.                     st.b    (ReqRemakeDPB)
  2730.                     st.b    (ReqSendRezeroUnit)
  2731.                 }
  2732.                 tst.b    (ReqAskSCSIConnect)
  2733.                 bst    ?_Err_Unconnect
  2734.             }
  2735.  .endif
  2736.             moveq.l    #0,d1
  2737.             move.b    REQH_UnitNo(a5),d1
  2738.             cmp.b    (DPBMaxCount),d1
  2739.             bcc    ?_Err_UnitNo
  2740.             tst.w    (FormatType)
  2741.             bmi    ?_Err_UnitNo
  2742.             tst.b    (SCSI_WriteProtectFlag)
  2743.             bst    ?_Err_Protect
  2744.             tst.b    (RealEjectedFlag)
  2745.             bst    ?_Err_Unconnect
  2746.  
  2747.             lea    DPBTable,a0
  2748.             mulu    #SizeOf1DPBTable,d1
  2749.             move.l    DPBTable_XDPBPtr(a0,d1.w),d0
  2750.             beq    ?_Err_UnitNo
  2751.             move.l    d0,a3
  2752.             move.l    DPBTable_BaseSec(a0,d1.w),d6
  2753.             move.w    DPBTable_Sft(a0,d1.w),d7
  2754.  
  2755.             move.l    REQH_Sec(a5),d2
  2756.             move.l    REQH_SecNum(a5),d3
  2757.             lsl.l    d7,d2
  2758.             lsl.l    d7,d3
  2759.             add.l    d6,d2
  2760.             move.l    d3,d6
  2761.  
  2762.             move.l    REQH_DataBufferPtr(a5),a1
  2763.             move.l    (SCSI_ID),d4
  2764.             andi.l    #$0007ffff,d4
  2765.             moveq.l    #0,d5
  2766.             move.b    (SCSI_BlockCapacity),d5
  2767.           ?_lp::
  2768.             move.l    (DivideAccessSize),d3
  2769.             cmp.l    d3,d6
  2770.             @ifcs    {
  2771.                 move.l    d6,d3
  2772.             }
  2773.             bsr    SCSI_S_WRITE
  2774.             tst.l    d0
  2775.             bmi    ?_Err_Unconnect
  2776.             bne    ?_Retry
  2777.             sub.l    d3,d6
  2778.             @ifne    {
  2779.                 move.w    (SCSI_BlockCapacityByte),d0
  2780.                 mulu    d3,d0
  2781.                 adda.l    d0,a1
  2782.                 add.l    d3,d2
  2783.                 bra    ?_lp
  2784.             }
  2785.  
  2786.             bsr    GetTime
  2787.             move.l    d0,(LastAccessTime)
  2788.             move.l    d1,(LastAccessDate)
  2789.             clr.b    (ReqAskSCSIConnect)
  2790.             moveq.l    #0,d0
  2791.             bra    ?_Quit
  2792.  
  2793.           ?_Retry::
  2794.             cmpi.b    #WRITERETRYCOUNT,(RetryFlag)
  2795.             bcc    ?_Err_Write
  2796.             addq.b    #1,(RetryFlag)
  2797.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  2798.             bsr    SCSI_S_SETFLAG
  2799.  .endif
  2800.             bra    ?_Retrylp
  2801.  
  2802.           ?_Err_Media::
  2803.             move.w    #$7007,d0    *無効なメディア,ARI
  2804.             bra    ?_Quit
  2805.  
  2806.           ?_Err_Protect::
  2807.             bsr    DrvCtrl_Eject_Core
  2808.             st.b    (ReqRemakeDPB)
  2809.             st.b    (ReqSendRezeroUnit)
  2810.             move.w    #$700d,d0    *ライトプロテクト,ARI
  2811.             bra    ?_Quit
  2812.  
  2813.           ?_Err_Unconnect::
  2814.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2815.             bra    ?_Quit
  2816.  
  2817.           ?_Err_Write::
  2818.             move.w    #$700a,d0    *書き込みエラー,ARI
  2819.             lea    SCSI_REQUESTBuf,a1
  2820.             move.b    2(a1),d1
  2821.             andi.b    #$0f,d1
  2822.             @switch [ d1 ].b {
  2823.               @case    #$02:    * $02 Not Ready
  2824.                 move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2825.                 @break;
  2826.               @case    #$07:    * $07 Data Protect
  2827.                 bsr    DrvCtrl_Eject_Core
  2828.                 move.w    #$700d,d0    *ライトプロテクト,ARI
  2829.                 @break;
  2830.             }
  2831.             bra    ?_Quit
  2832.  
  2833.           ?_Err_UnitNo::
  2834.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  2835.             bra    ?_Quit
  2836.  
  2837.           ?_Quit::
  2838.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  2839.             tst.w    d0
  2840.             @ifne    {
  2841.                 bsr    SCSI_S_SETFLAG
  2842.             }
  2843.  .endif
  2844.             movem.l    (sp)+,d1-d7/a0-a6
  2845.             rts
  2846.  
  2847.  .endif
  2848.  
  2849.         }
  2850.  
  2851.  
  2852. *************************************************************************
  2853.  
  2854.  
  2855. *    long    WriteVerifySec( void );
  2856. *
  2857. *        セクタに書き込み、ベリファイする。
  2858. *        in    a5    リクエストヘッダ
  2859. *                REQH_Magic00        常に26
  2860. *                REQH_UnitNo        ユニット番号
  2861. *                REQH_MediaID        メディアバイト
  2862. *                REQH_DataBufferPtr    データバッファへのポインタ
  2863. *                REQH_SecNum        セクタ数
  2864. *                REQH_Sec        開始セクタ番号
  2865. *        out    d0    エラーコード
  2866.  
  2867.  
  2868.         @xproc    [ WriteVerifySec ] {
  2869.             @return    [ d0, ErrCode ].l;
  2870.  
  2871.  .if CANNOTWRITE
  2872.  
  2873.     rts
  2874.  
  2875.  .else
  2876.  
  2877.             movem.l    d1-d7/a0-a6,-(sp)
  2878.  
  2879.             cmpi.b    #3,(SCSI_VERIFYMode)
  2880.             beq    WriteSec_Entry
  2881.  
  2882.           ?_Entry::
  2883.             clr.b    (RetryFlag)
  2884.           ?_Retrylp::
  2885.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  2886.             tst.b    (ReqRemakeDPB)
  2887.             @ifst    {
  2888.                 bsr    RemakeDPB
  2889.                 cmpi.w    #$0300,(HumanVersion)
  2890.                 @ifcc    {
  2891.                     st.b    (ReqRemakeDPB)
  2892.                     st.b    (ReqSendRezeroUnit)
  2893.                 }
  2894.                 tst.b    (ReqAskSCSIConnect)
  2895.                 bst    ?_Err_Unconnect
  2896.             }
  2897.  .endif
  2898.             moveq.l    #0,d1
  2899.             move.b    REQH_UnitNo(a5),d1
  2900.             cmp.b    (DPBMaxCount),d1
  2901.             bcc    ?_Err_UnitNo
  2902.             tst.w    (FormatType)
  2903.             bmi    ?_Err_UnitNo
  2904.             tst.b    (SCSI_WriteProtectFlag)
  2905.             bst    ?_Err_Protect
  2906.             tst.b    (RealEjectedFlag)
  2907.             bst    ?_Err_Unconnect
  2908.  
  2909.             lea    DPBTable,a0
  2910.             mulu    #SizeOf1DPBTable,d1
  2911.             move.l    DPBTable_XDPBPtr(a0,d1.w),d0
  2912.             beq    ?_Err_UnitNo
  2913.             move.l    d0,a3
  2914.             move.l    DPBTable_BaseSec(a0,d1.w),d6
  2915.             move.w    DPBTable_Sft(a0,d1.w),d7
  2916.  
  2917.             move.l    REQH_Sec(a5),d2
  2918.             move.l    REQH_SecNum(a5),d3
  2919.             lsl.l    d7,d2
  2920.             lsl.l    d7,d3
  2921.             add.l    d6,d2
  2922.             move.l    d3,d6
  2923.  
  2924.             move.l    REQH_DataBufferPtr(a5),a1
  2925.             move.l    (SCSI_ID),d4
  2926.             andi.l    #$0007ffff,d4
  2927.             moveq.l    #0,d5
  2928.             move.b    (SCSI_BlockCapacity),d5
  2929.             move.l    d6,d7
  2930.             move.l    d2,a2
  2931.             move.l    a1,a3
  2932.  
  2933.             tst.b    (SCSI_VerifyCmdFlag)
  2934.             @ifst    {
  2935.                 cmpi.b    #2,(SCSI_VERIFYMode)
  2936.                 beq    ?_HardWriteVerify
  2937.             }
  2938.  
  2939.           ?_Write::
  2940.             move.l    d7,d6
  2941.             move.l    a2,d2
  2942.             move.l    a3,a1
  2943.           ?_Write_lp::
  2944.             move.l    (DivideAccessSize),d3
  2945.             cmp.l    d3,d6
  2946.             @ifcs    {
  2947.                 move.l    d6,d3
  2948.             }
  2949.             bsr    SCSI_S_WRITE
  2950.             tst.l    d0
  2951.             bmi    ?_Err_Unconnect
  2952.             bne    ?_Retry
  2953.  
  2954.             sub.l    d3,d6
  2955.             @ifne    {
  2956.                 move.w    (SCSI_BlockCapacityByte),d0
  2957.                 mulu    d3,d0
  2958.                 adda.l    d0,a1
  2959.                 add.l    d3,d2
  2960.                 bra    ?_Write_lp
  2961.             }
  2962.  
  2963.             tst.b    (SCSI_VerifyCmdFlag)
  2964.             bcl    ?_SoftVerify
  2965.  
  2966.           ?_HardVerify::
  2967.             move.l    d7,d6
  2968.             move.l    a2,d2
  2969.             move.l    a3,a1
  2970.           ?_HardVerify_lp::
  2971.             move.l    (DivideAccessSize),d3
  2972.             cmp.l    d3,d6
  2973.             @ifcs    {
  2974.                 move.l    d6,d3
  2975.             }
  2976.             bsr    SCSI_S_VERIFY
  2977.             tst.l    d0
  2978.             bmi    ?_Err_Unconnect
  2979.             bne    ?_RetryVerify_Hard
  2980.  
  2981.             sub.l    d3,d6
  2982.             @ifne    {
  2983.                 move.w    (SCSI_BlockCapacityByte),d0
  2984.                 mulu    d3,d0
  2985.                 adda.l    d0,a1
  2986.                 add.l    d3,d2
  2987.                 bra    ?_HardVerify_lp
  2988.             }
  2989.             bra    ?_OK
  2990.  
  2991.           ?_HardWriteVerify::
  2992.             move.l    d7,d6
  2993.             move.l    a2,d2
  2994.             move.l    a3,a1
  2995.           ?_HardWriteVerify_lp::
  2996.             move.l    (DivideAccessSize),d3
  2997.             cmp.l    d3,d6
  2998.             @ifcs    {
  2999.                 move.l    d6,d3
  3000.             }
  3001.             bsr    SCSI_S_WRITEVERIFY
  3002.             tst.l    d0
  3003.             bmi    ?_Err_Unconnect
  3004.             bne    ?_RetryWriteVerify_Hard
  3005.  
  3006.             sub.l    d3,d6
  3007.             @ifne    {
  3008.                 move.w    (SCSI_BlockCapacityByte),d0
  3009.                 mulu    d3,d0
  3010.                 adda.l    d0,a1
  3011.                 add.l    d3,d2
  3012.                 bra    ?_HardWriteVerify_lp
  3013.             }
  3014.             bra    ?_OK
  3015.  
  3016.           ?_SoftVerify::
  3017.             move.l    d7,d6
  3018.             move.l    a2,d2
  3019.             move.l    a3,a1
  3020.           ?_SoftVerify_lp::
  3021.             move.l    (SoftVerifyBufSize),d3
  3022.             divu    (SCSI_BlockCapacityByte),d3
  3023.             andi.l    #$ffff,d3
  3024.             cmp.l    d3,d6
  3025.             @ifcs    {
  3026.                 move.l    d6,d3
  3027.             }
  3028.             move.l    a1,-(sp)
  3029.             lea    SoftVerifyBuf,a1
  3030.             bsr    SCSI_S_READ
  3031.             move.l    (sp)+,a1
  3032.             tst.l    d0
  3033.             bmi    ?_Err_Unconnect
  3034.             bne    ?_RetryVerify_Soft
  3035.             movem.l    a1/a2,-(sp)
  3036.             move.l    a1,a2
  3037.             lea    SoftVerifyBuf,a1
  3038.             move.w    (SCSI_BlockCapacityByte),d0
  3039.             mulu    d3,d0
  3040.             lsr.l    #3,d0
  3041.             subq.w    #1,d0
  3042.             @repeat [ d0 ].w {
  3043.                 cmpm.b    (a1)+,(a2)+
  3044.                 bne    ?_SoftVerify_NG
  3045.                 cmpm.b    (a1)+,(a2)+
  3046.                 bne    ?_SoftVerify_NG
  3047.                 cmpm.b    (a1)+,(a2)+
  3048.                 bne    ?_SoftVerify_NG
  3049.                 cmpm.b    (a1)+,(a2)+
  3050.                 bne    ?_SoftVerify_NG
  3051.                 cmpm.b    (a1)+,(a2)+
  3052.                 bne    ?_SoftVerify_NG
  3053.                 cmpm.b    (a1)+,(a2)+
  3054.                 bne    ?_SoftVerify_NG
  3055.                 cmpm.b    (a1)+,(a2)+
  3056.                 bne    ?_SoftVerify_NG
  3057.                 cmpm.b    (a1)+,(a2)+
  3058.                 bne    ?_SoftVerify_NG
  3059.             }
  3060.  
  3061.           ?_SoftVerify_OK::
  3062.             movem.l    (sp)+,a1/a2
  3063.             bra    ?_SoftVerify_Next
  3064.  
  3065.           ?_SoftVerify_NG::
  3066.             movem.l    (sp)+,a1/a2
  3067.             bra    ?_RetryVerify_Soft
  3068.  
  3069.           ?_SoftVerify_Next::
  3070.             sub.l    d3,d6
  3071.             @ifne    {
  3072.                 move.w    (SCSI_BlockCapacityByte),d0
  3073.                 mulu    d3,d0
  3074.                 adda.l    d0,a1
  3075.                 add.l    d3,d2
  3076.                 bra    ?_SoftVerify_lp
  3077.             }
  3078.             bra    ?_OK
  3079.  
  3080.           ?_OK::
  3081.             bsr    GetTime
  3082.             move.l    d0,(LastAccessTime)
  3083.             move.l    d1,(LastAccessDate)
  3084.             clr.b    (ReqAskSCSIConnect)
  3085.             moveq.l    #0,d0
  3086.             bra    ?_Quit
  3087.  
  3088.           ?_Retry::
  3089.             cmpi.b    #WRITERETRYCOUNT,(RetryFlag)
  3090.             bcc    ?_Err_Write
  3091.             addq.b    #1,(RetryFlag)
  3092.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  3093.             bsr    SCSI_S_SETFLAG
  3094.  .endif
  3095.             bra    ?_Retrylp
  3096.  
  3097.           ?_RetryVerify_Hard::
  3098.             cmpi.b    #WRITERETRYCOUNT,(RetryFlag)
  3099.             bcc    ?_RetryVerify_Hard_2
  3100.             addq.b    #1,(RetryFlag)
  3101.             bra    ?_HardVerify_lp
  3102.           ?_RetryVerify_Hard_2::
  3103.             clr.b    (RetryFlag)
  3104.             bra    ?_SoftVerify
  3105.  
  3106.           ?_RetryWriteVerify_Hard::
  3107.             cmpi.b    #WRITERETRYCOUNT,(RetryFlag)
  3108.             bcc    ?_RetryWriteVerify_Hard_2
  3109.             addq.b    #1,(RetryFlag)
  3110.             bra    ?_HardWriteVerify_lp
  3111.           ?_RetryWriteVerify_Hard_2::
  3112.             clr.b    (RetryFlag)
  3113.             clr.b    (SCSI_VerifyCmdFlag)
  3114.             bra    ?_Write
  3115.  
  3116.           ?_RetryVerify_Soft::
  3117.             cmpi.b    #WRITERETRYCOUNT,(RetryFlag)
  3118.             bcc    ?_Err_Verify
  3119.             addq.b    #1,(RetryFlag)
  3120.             bra    ?_SoftVerify_lp
  3121.  
  3122.           ?_Err_Media::
  3123.             move.w    #$7007,d0    *無効なメディア,ARI
  3124.             bra    ?_Quit
  3125.  
  3126.           ?_Err_Protect::
  3127.             bsr    DrvCtrl_Eject_Core
  3128.             st.b    (ReqRemakeDPB)
  3129.             st.b    (ReqSendRezeroUnit)
  3130.             move.w    #$700d,d0    *ライトプロテクト,ARI
  3131.             bra    ?_Quit
  3132.  
  3133.           ?_Err_Unconnect::
  3134.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  3135.             bra    ?_Quit
  3136.  
  3137.           ?_Err_Write::
  3138.             move.w    #$700a,d0    *書き込みエラー,ARI
  3139.             lea    SCSI_REQUESTBuf,a1
  3140.             move.b    2(a1),d1
  3141.             andi.b    #$0f,d1
  3142.             @switch [ d1 ].b {
  3143.               @case    #$02:    * $02 Not Ready
  3144.                 move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  3145.                 @break;
  3146.               @case    #$07:    * $07 Data Protect
  3147.                 bsr    DrvCtrl_Eject_Core
  3148.                 move.w    #$700d,d0    *ライトプロテクト,ARI
  3149.                 @break;
  3150.             }
  3151.             bra    ?_Quit
  3152.  
  3153.           ?_Err_Verify::
  3154.             move.w    #$7004,d0    *CRCエラー,ARI
  3155.             lea    SCSI_REQUESTBuf,a1
  3156.             move.b    2(a1),d1
  3157.             andi.b    #$0f,d1
  3158.             @switch [ d1 ].b {
  3159.               @case    #$02:    * $02 Not Ready
  3160.                 move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  3161.                 @break;
  3162.               @case    #$07:    * $07 Data Protect
  3163.                 bsr    DrvCtrl_Eject_Core
  3164.                 move.w    #$700d,d0    *ライトプロテクト,ARI
  3165.                 @break;
  3166.             }
  3167.             bra    ?_Quit
  3168.  
  3169.           ?_Err_UnitNo::
  3170.             move.w    #$7002,d0    *ドライブの準備ができていない,ARI
  3171.             bra    ?_Quit
  3172.  
  3173.           ?_Quit::
  3174.  .if 0    * 書き込み失敗時はRemakeDPBしてはならない
  3175.             tst.w    d0
  3176.             @ifne    {
  3177.                 bsr    SCSI_S_SETFLAG
  3178.             }
  3179.  .endif
  3180.             movem.l    (sp)+,d1-d7/a0-a6
  3181.             rts
  3182.  
  3183.  .endif
  3184.  
  3185.         }
  3186.  
  3187.  
  3188. *************************************************************************
  3189.  
  3190.  
  3191. *    long    FindDir( void );
  3192. *
  3193. *        ディレクトリを検索する。特殊デバイスドライバ用。
  3194. *        in    a5    リクエストヘッダ
  3195. *                REQH_Magic00        常に26
  3196. *                REQH_UnitNo        ユニット番号
  3197. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  3198. *                REQH_Result        検索結果を返す
  3199. *        out    d0    エラーコード
  3200.  
  3201.  
  3202.         @xproc    [ FindDir ] {
  3203.             @return    [ d0, ErrCode ].l;
  3204.  
  3205.             movem.l    d1-d7/a0-a6,-(sp)
  3206.  
  3207.           ?_Entry::
  3208.             moveq.l    #-1,d0
  3209.             move.l    d0,(LastFindDirIndexPtr)
  3210.             move.l    d0,(LastFindFileIndexPtr)
  3211.             lea    $9c+CDROMHeadSecReadBuf,a1
  3212.             move.l    REQH_OSFileNamePtr(a5),a3
  3213.             addq.w    #2,a3
  3214.             cmpi.b    #$09,(a3)
  3215.             bne    ?_Err_OS
  3216.             clr.l    (CDROMCacheIndex)
  3217.  .if 1
  3218.             tst.b    (ReqRemakeDPB)
  3219.             @ifst    {
  3220.                 bsr    RemakeDPB
  3221.             }
  3222.  .endif
  3223.             tst.b    (CDROMHeadSecReadBuf)
  3224.             beq    ?_Err_Media
  3225.             moveq.l    #0,d3
  3226.  
  3227.           ?_FindNext::
  3228.             cmpi.b    #$09,(a3)+
  3229.             bne    ?_Err_OS
  3230.             add.l    d3,(CDROMCacheIndex)
  3231.             moveq.l    #0,d2
  3232.             move.b    EIS9_Adjust(a1),d2
  3233. *            add.l    EIS9_SectorMotorola(a1),d2
  3234.             subq.w    #4,sp
  3235.             move.b    EIS9_SectorMotorola+0(a1),0(sp)
  3236.             move.b    EIS9_SectorMotorola+1(a1),1(sp)
  3237.             move.b    EIS9_SectorMotorola+2(a1),2(sp)
  3238.             move.b    EIS9_SectorMotorola+3(a1),3(sp)
  3239.             add.l    (sp)+,d2
  3240. *            move.l    EIS9_SizeMotorola(a1),d3
  3241.             subq.w    #4,sp
  3242.             move.b    EIS9_SizeMotorola+0(a1),0(sp)
  3243.             move.b    EIS9_SizeMotorola+1(a1),1(sp)
  3244.             move.b    EIS9_SizeMotorola+2(a1),2(sp)
  3245.             move.b    EIS9_SizeMotorola+3(a1),3(sp)
  3246.             move.l    (sp)+,d3
  3247.             addi.l    #$7ff,d3
  3248.             moveq.l    #$0b,d0
  3249.             lsr.l    d0,d3
  3250.             subq.w    #1,d3
  3251.             tst.b    (a3)
  3252.             beq    ?_Found
  3253.  
  3254.           ?_ReadNext::
  3255.             moveq.l    #1,d1
  3256.             bsr    ReadCDROMCache
  3257.             tst.w    d0
  3258.             bne    ?_Quit
  3259.  
  3260.           ?_MatchNext::
  3261.             btst.b    #1,EIS9_Atr(a1)
  3262.             @ifst    {
  3263.                 bsr    ?_MatchSub
  3264.                 tst.l    d0
  3265.                 beq    ?_FindNext
  3266.             }
  3267.             moveq.l    #0,d0
  3268.             move.b    EIS9_EntrySize(a1),d0
  3269.             adda.w    d0,a1
  3270.             tst.b    (a1)
  3271.             bne    ?_MatchNext
  3272.             bsr    GetPhysicalCDROM1Sector
  3273.             add.l    d0,d2
  3274.             dbra    d3,?_ReadNext
  3275.  
  3276.           ?_NotFound::
  3277.             moveq.l    #$fd,d0
  3278.             move.l    d0,(ReturnResult)
  3279.             moveq.l    #0,d0
  3280.             bra    ?_Quit
  3281.           ?_Err_OS::
  3282.             moveq.l    #1,d0
  3283.             bra    ?_Quit
  3284.  
  3285.           ?_Err_Media::
  3286.             move.w    #$7002,d0
  3287.             bra    ?_Quit
  3288.  
  3289.           ?_Found::
  3290.             move.l    a1,(LastFindDirIndexPtr)
  3291.             moveq.l    #0,d0
  3292.             move.l    d0,(ReturnResult)
  3293.  
  3294.           ?_Quit::
  3295.             movem.l    (sp)+,d1-d7/a0-a6
  3296.             rts
  3297.  
  3298.           ?_MatchSub::
  3299.             movem.l    d1/d2/d6/d7/a1/a2,-(sp)
  3300.  
  3301.             move.l    a3,d6
  3302.             moveq.l    #0,d7
  3303.             move.b    EIS9_NameSize(a1),d7
  3304.             lea    EIS9_Name(a1),a2
  3305.  
  3306.             @do {
  3307.                 subq.w    #1,d7
  3308.                 @break.cs;
  3309.                 move.b    (a2)+,d1
  3310.                 cmpi.b    #';',d1
  3311.                 @break.eq;
  3312.                 ToUpper    d1
  3313.                 move.b    (a3)+,d2
  3314.                 ToUpper    d2
  3315.                 cmp.b    d1,d2
  3316.                 bne    ?_MatchSub_NG
  3317.             } @while.t;
  3318.             cmpi.b    #9,(a3)
  3319.             beq    ?_MatchSub_OK
  3320.  
  3321.           ?_MatchSub_NG::
  3322.             moveq.l    #1,d0
  3323.             move.l    d6,a3
  3324.             bra    ?_MatchSub_e
  3325.  
  3326.           ?_MatchSub_OK::
  3327.             moveq.l    #0,d0
  3328.  
  3329.           ?_MatchSub_e::
  3330.             movem.l    (sp)+,d1/d2/d6/d7/a1/a2
  3331.             rts
  3332.  
  3333.         }
  3334.  
  3335.  
  3336. *************************************************************************
  3337.  
  3338.  
  3339. *    long    FindFil( void );
  3340. *
  3341. *        ファイルを検索する。特殊デバイスドライバ用。
  3342. *        in    a5    リクエストヘッダ
  3343. *                REQH_Magic00        常に26
  3344. *                REQH_UnitNo        ユニット番号
  3345. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  3346. *                REQH_Result        検索結果を返す
  3347. *        out    d0    エラーコード
  3348.  
  3349.  
  3350.         @xproc    [ FindFil ] {
  3351.             @return    [ d0, ErrCode ].l;
  3352.  
  3353.             movem.l    d1-d7/a0-a6,-(sp)
  3354.  
  3355.           ?_Entry::
  3356.             move.l    (LastFindDirIndexPtr),d0
  3357.             bmi    ?_Err_OS
  3358.             move.l    d0,a1
  3359.             move.l    REQH_OSFileNamePtr(a5),a3
  3360.             lea    $43(a3),a3
  3361.  
  3362.           ?_FindNext::
  3363.             moveq.l    #0,d2
  3364.             move.b    EIS9_Adjust(a1),d2
  3365. *            add.l    EIS9_SectorMotorola(a1),d2
  3366.             subq.w    #4,sp
  3367.             move.b    EIS9_SectorMotorola+0(a1),0(sp)
  3368.             move.b    EIS9_SectorMotorola+1(a1),1(sp)
  3369.             move.b    EIS9_SectorMotorola+2(a1),2(sp)
  3370.             move.b    EIS9_SectorMotorola+3(a1),3(sp)
  3371.             add.l    (sp)+,d2
  3372. *            move.l    EIS9_SizeMotorola(a1),d3
  3373.             subq.w    #4,sp
  3374.             move.b    EIS9_SizeMotorola+0(a1),0(sp)
  3375.             move.b    EIS9_SizeMotorola+1(a1),1(sp)
  3376.             move.b    EIS9_SizeMotorola+2(a1),2(sp)
  3377.             move.b    EIS9_SizeMotorola+3(a1),3(sp)
  3378.             move.l    (sp)+,d3
  3379.             addi.l    #$7ff,d3
  3380.             moveq.l    #$0b,d0
  3381.             lsr.l    d0,d3
  3382.             subq.w    #1,d3
  3383.             move.w    (CDROMCacheBufSize),d1
  3384.  
  3385.           ?_ReadNext::
  3386.             moveq.l    #1,d1
  3387.             bsr    ReadCDROMCache
  3388.             tst.w    d0
  3389.             bne    ?_Quit
  3390.  
  3391.           ?_MatchNext::
  3392.             bsr    ?_MatchSub
  3393.             tst.l    d0
  3394.             beq    ?_Found
  3395.             moveq.l    #0,d0
  3396.             move.b    EIS9_EntrySize(a1),d0
  3397.             adda.w    d0,a1
  3398.             tst.b    (a1)
  3399.             bne    ?_MatchNext
  3400.             bsr    GetPhysicalCDROM1Sector
  3401.             add.l    d0,d2
  3402.             dbra    d3,?_ReadNext
  3403.  
  3404.           ?_NotFound::
  3405.             moveq.l    #$fe,d0
  3406.             move.l    d0,(ReturnResult)
  3407.             moveq.l    #0,d0
  3408.             bra    ?_Quit
  3409.  
  3410.           ?_Err_OS::
  3411.             moveq.l    #1,d0
  3412.             bra    ?_Quit
  3413.  
  3414.           ?_Found::
  3415.             moveq.l    #$10,d0
  3416.             btst.b    #1,EIS9_Atr(a1)
  3417.             @ifcl    {
  3418.                 moveq.l    #$20,d0
  3419.             }
  3420.             move.l    d0,(ReturnResult)
  3421.             move.l    a1,(LastFindFileIndexPtr)
  3422.             moveq.l    #0,d0
  3423.  
  3424.           ?_Quit::
  3425.             movem.l    (sp)+,d1-d7/a0-a6
  3426.             rts
  3427.  
  3428.           ?_MatchSub::
  3429.             movem.l    d1-d7/a1/a2,-(sp)
  3430.  
  3431.             move.l    a3,d6
  3432.             moveq.l    #0,d7
  3433.             move.b    EIS9_NameSize(a1),d7
  3434.             lea    EIS9_Name(a1),a2
  3435.  
  3436.           ?_MatchSub_0::
  3437.             * ベース8文字の合致を調べる
  3438.             moveq.l    #8,d5
  3439.  
  3440.             btst.b    #2,EIS9_Atr(a1)
  3441.             @ifst    {
  3442.                 tst.b    (BrowseResourceFlag)
  3443.                 bcl    ?_MatchSub_NG
  3444.                 {
  3445.                     move.b    (a3)+,d1
  3446.                     cmpi.b    #'?',d1
  3447.                     beq    >
  3448.                     cmpi.b    #'#',d1
  3449.                     bne    ?_MatchSub_NG
  3450.                 }
  3451.                 subq.b    #1,d5
  3452.             }
  3453.  
  3454.           ?_MatchSub_1::
  3455.             @do {
  3456.                 subq.w    #1,d7
  3457.                 @ifcs    {
  3458.                     addq.w    #1,d7
  3459.                     @break;
  3460.                 }
  3461.                 move.b    (a2)+,d1
  3462.                 cmpi.b    #';',d1
  3463.                 @ifeq    {
  3464.                     addq.w    #1,d7
  3465.                     subq.w    #1,a2
  3466.                     @break;
  3467.                 }
  3468.                 cmpi.b    #1,d1
  3469.                 @ifls    {
  3470.                     @ifeq    {
  3471.                         addq.w    #1,d7
  3472.                         subq.w    #1,a2
  3473.                     }
  3474.                     @break;
  3475.                 }
  3476.                 cmpi.b    #'.',d1
  3477.                 @ifeq    {
  3478.                     cmp.b    (a3),d1
  3479.                     @ifne    {
  3480.                         addq.w    #1,d7
  3481.                         subq.w    #1,a2
  3482.                         @break;
  3483.                     }
  3484.                 }
  3485.                 subq.b    #1,d5
  3486.                 @ifcs    {
  3487.                     addq.b    #1,d5
  3488.                     @break;
  3489.                 }
  3490.                 move.b    (a3)+,d2
  3491.                 cmpi.b    #'?',d2
  3492.                 @continue.eq;
  3493.                 ToUpper    d1
  3494.                 ToUpper    d2
  3495.                 cmp.b    d1,d2
  3496.                 bne    ?_MatchSub_NG
  3497.             } @while.t;
  3498.  
  3499.             * CD側ベースが8文字未満ならその分のワイルドカード合致チェック
  3500.           ?_MatchSub_2::
  3501.             tst.b    d5
  3502.             @ifne    {
  3503.                 @do {
  3504.                     subq.b    #1,d5
  3505.                     @break.cs;
  3506.                     move.b    (a3)+,d0
  3507.                     cmpi.b    #' ',d0
  3508.                     @continue.eq;
  3509.                     cmpi.b    #'?',d0
  3510.                     @continue.eq;
  3511.                     cmpi.b    #'.',d0
  3512.                     @ifeq    {
  3513.                         cmpi.b    #'.',d1
  3514.                         @continue.eq;
  3515.                     }
  3516.                     bra    ?_MatchSub_NG
  3517.                 } @while.t;
  3518.             }
  3519.  
  3520.             * CD側ポインタを最後の'.'までスキップさせる
  3521.           ?_MatchSub_3::
  3522.             moveq.l    #0,d3
  3523.             moveq.l    #0,d7
  3524.             move.b    EIS9_NameSize(a1),d7
  3525.             lea    EIS9_Name(a1),a2
  3526.             @do {
  3527.                 subq.w    #1,d7
  3528.                 @ifcs    {
  3529.                     addq.w    #1,d7
  3530.                     tst.l    d3
  3531.                     @ifne    {
  3532.                         move.l    d3,a2
  3533.                         move.l    d4,d7
  3534.                     }
  3535.                     @break;
  3536.                 }
  3537.                 move.b    (a2)+,d1
  3538.                 cmpi.b    #1,d1
  3539.                 @ifls    {
  3540.                     @ifeq    {
  3541.                         addq.w    #1,d7
  3542.                         subq.w    #1,a2
  3543.                     }
  3544.                     @break;
  3545.                 }
  3546.                 cmpi.b    #';',d1
  3547.                 @ifeq    {
  3548.                     addq.w    #1,d7
  3549.                     subq.w    #1,a2
  3550.                     tst.l    d3
  3551.                     @ifne    {
  3552.                         move.l    d3,a2
  3553.                         move.l    d4,d7
  3554.                     }
  3555.                     @break;
  3556.                 }
  3557.                 cmpi.b    #'.',d1
  3558.                 @ifeq    {
  3559.                     move.l    a2,d3
  3560.                     move.l    d7,d4
  3561.                 }
  3562.             } @while.t;
  3563.  
  3564.             * 拡張子の合致チェック
  3565.           ?_MatchSub_4::
  3566.             move.l    d6,a3
  3567.             addq.w    #8,a3
  3568.             moveq.l    #3,d5
  3569.             @do {
  3570.                 subq.w    #1,d7
  3571.                 @ifcs    {
  3572.                     addq.w    #1,d7
  3573.                     @break;
  3574.                 }
  3575.                 move.b    (a2)+,d1
  3576.                 cmpi.b    #';',d1
  3577.                 @break.eq;
  3578.                 subq.b    #1,d5
  3579.                 @ifcs    {
  3580.                     addq.b    #1,d5
  3581.                     @break;
  3582.                 }
  3583.                 cmpi.b    #1,d1
  3584.                 @ifls    {
  3585.                     move.b    #'.',d1
  3586.                 }
  3587.                 move.b    (a3)+,d2
  3588.                 cmpi.b    #'?',d2
  3589.                 @continue.eq;
  3590.                 ToUpper    d1
  3591.                 ToUpper    d2
  3592.                 cmp.b    d1,d2
  3593.                 bne    ?_MatchSub_NG
  3594.             } @while.t;
  3595.  
  3596.             * CD側ベースが3文字未満ならその分のワイルドカード合致チェック
  3597.           ?_MatchSub_5::
  3598.             @do {
  3599.                 subq.b    #1,d5
  3600.                 @break.cs;
  3601.                 move.b    (a3)+,d0
  3602.                 cmpi.b    #$20,d0
  3603.                 @break.eq;
  3604.                 cmpi.b    #'?',d0
  3605.                 @continue.eq;
  3606.                 bra    ?_MatchSub_NG
  3607.             } @while.t;
  3608.             bra    ?_MatchSub_OK
  3609.  
  3610.           ?_MatchSub_NG::
  3611.             moveq.l    #1,d0
  3612.             move.l    d6,a3
  3613.             bra    ?_MatchSub_e
  3614.  
  3615.           ?_MatchSub_OK::
  3616.             moveq.l    #0,d0
  3617.  
  3618.           ?_MatchSub_e::
  3619.             movem.l    (sp)+,d1-d7/a1/a2
  3620.             rts
  3621.  
  3622.         }
  3623.  
  3624.  
  3625. *************************************************************************
  3626.  
  3627.  
  3628. *    long    StartFiles( void );
  3629. *
  3630. *        ディレクトリリスト取得を開始する。特殊デバイスドライバ用。
  3631. *        in    a5    リクエストヘッダ
  3632. *                REQH_Magic00        常に26
  3633. *                REQH_UnitNo        ユニット番号
  3634. *                REQH_FindAtr        検索属性
  3635. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  3636. *                REQH_DirListPtr        ディレクトリリストを返す
  3637. *                REQH_Result        検索結果を返す
  3638. *        out    d0    エラーコード
  3639.  
  3640.  
  3641.         @xproc    [ StartFiles ] {
  3642.             @return    [ d0, ErrCode ].l;
  3643.  
  3644.             movem.l    d1-d7/a0-a6,-(sp)
  3645.  
  3646.           ?_Entry::
  3647.             move.l    (LastFindDirIndexPtr),d0
  3648.             bmi    ?_Err_OS
  3649.             move.l    d0,a1
  3650.  
  3651.           ?_FindNext::
  3652.             move.l    REQH_DirListPtr(a5),a0
  3653.             move.b    REQH_SearchAtr(a5),$00(a0)
  3654.             moveq.l    #0,d2
  3655.             move.b    EIS9_Adjust(a1),d2
  3656. *            add.l    EIS9_SectorMotorola(a1),d2
  3657.             subq.w    #4,sp
  3658.             move.b    EIS9_SectorMotorola+0(a1),0(sp)
  3659.             move.b    EIS9_SectorMotorola+1(a1),1(sp)
  3660.             move.b    EIS9_SectorMotorola+2(a1),2(sp)
  3661.             move.b    EIS9_SectorMotorola+3(a1),3(sp)
  3662.             add.l    (sp)+,d2
  3663. *            move.l    EIS9_SizeMotorola(a1),d3
  3664.             subq.w    #4,sp
  3665.             move.b    EIS9_SizeMotorola+0(a1),0(sp)
  3666.             move.b    EIS9_SizeMotorola+1(a1),1(sp)
  3667.             move.b    EIS9_SizeMotorola+2(a1),2(sp)
  3668.             move.b    EIS9_SizeMotorola+3(a1),3(sp)
  3669.             move.l    (sp)+,d3
  3670.             addi.l    #$7ff,d3
  3671.             moveq.l    #0,d4
  3672.             moveq.l    #$0b,d0
  3673.             lsr.l    d0,d3
  3674.             subq.w    #1,d3
  3675.             move.l    d2,$02(a0)
  3676.             move.w    d3,$06(a0)
  3677.             clr.w    $08(a0)
  3678.  
  3679.             move.l    REQH_OSFileNamePtr(a5),a3
  3680.             tst.b    3(a3)
  3681.             @ifeq    {
  3682.                 btst.b    #3,(a0)
  3683.                 bst    ?_MatchSub_Volume
  3684.             }
  3685.  
  3686.           ?_Entry2::
  3687.  
  3688.           ?_ReadNext::
  3689.             tst.w    d3
  3690.             bmi    ?_NotFound
  3691.             moveq.l    #1,d1
  3692.             bsr    ReadCDROMCache
  3693.             tst.w    d0
  3694.             bne    ?_Quit
  3695.             add.l    d4,a1
  3696.  
  3697.           ?_MatchNext::
  3698.             lea    $0a(a0),a3
  3699.             bsr    ?_MatchSub
  3700.             tst.l    d0
  3701.             beq    ?_Found
  3702.             moveq.l    #0,d0
  3703.             move.b    EIS9_EntrySize(a1),d0
  3704.             adda.w    d0,a1
  3705.             add.w    d0,d4
  3706.             cmpi.w    #$800-SizeOfEIS9+1,d4
  3707.             @ifcs    {
  3708.                 tst.b    (a1)
  3709.                 bne    ?_MatchNext
  3710.             }
  3711.             moveq.l    #0,d4
  3712.             bsr    GetPhysicalCDROM1Sector
  3713.             add.l    d0,d2
  3714.             dbra    d3,?_ReadNext
  3715.  
  3716.           ?_NotFound::
  3717.             moveq.l    #$fe,d0
  3718.             move.l    d0,(ReturnResult)
  3719.             moveq.l    #0,d0
  3720.             bra    ?_Quit
  3721.  
  3722.           ?_Err_OS::
  3723.             moveq.l    #1,d0
  3724.             bra    ?_Quit
  3725.  
  3726.           ?_Found::
  3727.             moveq.l    #0,d0
  3728.             move.b    EIS9_EntrySize(a1),d0
  3729.             adda.w    d0,a1
  3730.             add.w    d0,d4
  3731.             @if [ cmpi.w #$800-SizeOfEIS9+1,d4 ].cc @or
  3732.                 [ tst.b (a1) ].eq {
  3733.                 moveq.l    #0,d4
  3734.                 bsr    GetPhysicalCDROM1Sector
  3735.                 add.l    d0,d2
  3736.                 subq.w    #1,d3
  3737.             }
  3738.             move.l    d2,$02(a0)
  3739.             move.w    d3,$06(a0)
  3740.             move.w    d4,$08(a0)
  3741.           ?_Found_::
  3742.             moveq.l    #0,d0
  3743.             move.l    d0,(ReturnResult)
  3744.  
  3745.           ?_Quit::
  3746.             movem.l    (sp)+,d1-d7/a0-a6
  3747.             rts
  3748.  
  3749.           ?_MatchSub::
  3750.             moveq.l    #0,d1
  3751.             move.b    $00(a0),d0
  3752.             btst    #5,d0
  3753.             @ifst    {
  3754.                 btst.b    #1,EIS9_Atr(a1)
  3755.                 @ifcl    {
  3756.                     bset    #5,d1
  3757.                 }
  3758.             }
  3759.             btst    #4,d0
  3760.             @ifst    {
  3761.                 btst.b    #1,EIS9_Atr(a1)
  3762.                 @ifst    {
  3763.                     bset    #4,d1
  3764.                 }
  3765.             }
  3766.             tst.b    d1
  3767.             beq    ?_MatchSub_Quit
  3768.             bsr    FindFil_MatchSub
  3769.             tst.l    d0
  3770.             @ifeq    {
  3771.                 bsr    ?_MakeFileInfo
  3772.             }
  3773.           ?_MatchSub_Quit::
  3774.             rts
  3775.  
  3776.           ?_MatchSub_Volume::
  3777.             lea    $0a(a0),a3
  3778.             lea    VolumeEIS9,a1
  3779.             bsr    FindFil_MatchSub
  3780.             moveq.l    #$08,d1
  3781.             tst.l    d0
  3782.             bne    ?_Entry2
  3783.             bsr    ?_MakeFileInfo
  3784.             move.l    d2,$02(a0)
  3785.             move.w    d3,$06(a0)
  3786.             move.w    d4,$08(a0)
  3787.             bra    ?_Found_
  3788.  
  3789.           ?_MakeFileInfo::
  3790.             movem.l    d0-d7/a0-a6,-(sp)
  3791.             move.b    d1,$15(a0)
  3792.             move.b    EIS9_Year(a1),d0
  3793.             subi.b    #80,d0
  3794.             lsl.w    #4,d0
  3795.             or.b    EIS9_Month(a1),d0
  3796.             lsl.w    #5,d0
  3797.             or.b    EIS9_Day(a1),d0
  3798.             move.w    d0,$18(a0)
  3799.             move.b    EIS9_Hour(a1),d0
  3800.             lsl.w    #6,d0
  3801.             or.b    EIS9_Min(a1),d0
  3802.             lsl.l    #6,d0
  3803.             or.b    EIS9_Sec(a1),d0
  3804.             lsr.l    #1,d0
  3805.             move.w    d0,$16(a0)
  3806. *            move.l    EIS9_SizeMotorola(a1),d0
  3807.             subq.w    #4,sp
  3808.             move.b    EIS9_SizeMotorola+0(a1),0(sp)
  3809.             move.b    EIS9_SizeMotorola+1(a1),1(sp)
  3810.             move.b    EIS9_SizeMotorola+2(a1),2(sp)
  3811.             move.b    EIS9_SizeMotorola+3(a1),3(sp)
  3812.             move.l    (sp)+,d0
  3813.             btst.b    #1,EIS9_Atr(a1)
  3814.             @ifst    {
  3815.                 moveq.l    #0,d0
  3816.             }
  3817.             move.l    d0,$1a(a0)
  3818.             lea    $1e(a0),a0
  3819.             moveq.l    #0,d6
  3820.             move.b    EIS9_NameSize(a1),d6
  3821.             lea    EIS9_Name(a1),a2
  3822.             move.b    (a2),d0
  3823.             @switch [ d0 ].b {
  3824.               @case    #1:
  3825.                 move.b    #'.',(a0)+
  3826.               @case    #0:
  3827.                 move.b    #'.',(a0)+
  3828.                 @break;
  3829.               @default:
  3830.                 * ベースをコピー
  3831.                 moveq.l    #0,d2
  3832.                 moveq.l    #0,d5
  3833.                 move.l    d6,d7
  3834.                 cmpi.b    #18,d7
  3835.                 @ifcc    {
  3836.                     moveq.l    #18,d7
  3837.                 }
  3838.                 * リソースのチェック
  3839.                 tst.b    (BrowseResourceFlag)
  3840.                 @ifst    {
  3841.                     btst.b    #2,EIS9_Atr(a1)
  3842.                     @ifst    {
  3843.                         move.b    #'#',(a0)+
  3844.                         subq.w    #1,d7
  3845.                     }
  3846.                 }
  3847.                 subq.w    #1,d7
  3848.                 @repeat [ d7 ].w {
  3849.                     move.b    (a2)+,d0
  3850.                     subq.b    #1,d6
  3851.                     cmpi.b    #';',d0
  3852.                     @break.eq;
  3853.                     cmpi.b    #'.',d0
  3854.                     @ifeq    {
  3855.                         move.l    a0,d2
  3856.                         move.l    a2,d5
  3857.                     }
  3858.                     cmpi.b    #' '+1,d0
  3859.                     @ifcs    {
  3860.                         move.b    #'_',d0
  3861.                     }
  3862.                     move.b    d0,(a0)+
  3863.                 }
  3864.                 tst.b    d6
  3865.                 @break.eq;
  3866.                 cmpi.b    #';',d0
  3867.                 @break.eq;
  3868.                 * ポインタを最後の'.'までスキップ
  3869.                 moveq.l    #0,d3
  3870.                 moveq.l    #0,d6
  3871.                 move.b    EIS9_NameSize(a1),d6
  3872.                 lea    EIS9_Name(a1),a2
  3873.                 @do {
  3874.                     move.b    (a2)+,d0
  3875.                     subq.w    #1,d6
  3876.                     cmpi.b    #';',d0
  3877.                     @break.eq;
  3878.                     cmpi.b    #'.',d0
  3879.                     @ifeq    {
  3880.                         move.l    a2,d3
  3881.                         move.l    d6,d4
  3882.                     }
  3883.                     tst.b    d6
  3884.                 } @while.ne;
  3885.                 tst.l    d3
  3886.                 @break.eq;
  3887.                 * 拡張子をコピー
  3888.                 move.l    d3,a2
  3889.                 move.l    d4,d6
  3890.                 cmp.l    a2,d5
  3891.                 @ifeq    {
  3892.                     tst.l    d2
  3893.                     @ifne    {
  3894.                         move.l    d2,a0
  3895.                     }
  3896.                 }
  3897.                 move.b    #'.',(a0)+
  3898.                 move.l    d6,d7
  3899.                 cmpi.b    #3,d7
  3900.                 @ifcc    {
  3901.                     moveq.l    #3,d7
  3902.                 }
  3903.                 subq.w    #1,d7
  3904.                 @repeat [ d7 ].w {
  3905.                     move.b    (a2)+,d0
  3906.                     subq.b    #1,d6
  3907.                     cmpi.b    #';',d0
  3908.                     @break.eq;
  3909.                     cmpi.b    #'.',d0
  3910.                     @break.eq;
  3911.                     cmpi.b    #' '+1,d0
  3912.                     @ifcs    {
  3913.                         move.b    #'_',d0
  3914.                     }
  3915.                     move.b    d0,(a0)+
  3916.                 }
  3917.  
  3918.                 @break;
  3919.             }
  3920.             clr.b    (a0)
  3921.             movem.l    (sp)+,d0-d7/a0-a6
  3922.             rts
  3923.  
  3924.         }
  3925.  
  3926.  
  3927. *************************************************************************
  3928.  
  3929.  
  3930. *    long    NextFiles( void );
  3931. *
  3932. *        ディレクトリリストを取得する。特殊デバイスドライバ用。
  3933. *        in    a5    リクエストヘッダ
  3934. *                REQH_Magic00        常に26
  3935. *                REQH_UnitNo        ユニット番号
  3936. *                REQH_FindAtr        検索属性
  3937. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  3938. *                REQH_DirListPtr        ディレクトリリストを返す
  3939. *                REQH_Result        検索結果を返す
  3940. *        out    d0    エラーコード
  3941.  
  3942.  
  3943.         @xproc    [ NextFiles ] {
  3944.             @return    [ d0, ErrCode ].l;
  3945.  
  3946.             movem.l    d1-d7/a0-a6,-(sp)
  3947.  
  3948.           ?_Entry::
  3949.             move.l    (LastFindDirIndexPtr),d0
  3950.             bmi    StartFiles_Err_OS
  3951.             move.l    d0,a1
  3952.  
  3953.           ?_FindNext::
  3954.             move.l    REQH_DirListPtr(a5),a0
  3955.             move.l    $02(a0),d2
  3956.             move.w    $06(a0),d3
  3957.             moveq.l    #0,d4
  3958.             move.w    $08(a0),d4
  3959.             bra    StartFiles_Entry2
  3960.  
  3961.         }
  3962.  
  3963.  
  3964. *************************************************************************
  3965.  
  3966.  
  3967. *    long    OpenFil( void );
  3968. *
  3969. *        ファイルを開く。特殊デバイスドライバ用。
  3970. *        in    a5    リクエストヘッダ
  3971. *                REQH_Magic00        常に26
  3972. *                REQH_UnitNo        ユニット番号
  3973. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  3974. *                REQH_Result        検索結果を返す
  3975. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  3976. *        out    d0    エラーコード
  3977.  
  3978.  
  3979.         @xproc    [ OpenFil ] {
  3980.             @return    [ d0, ErrCode ].l;
  3981.  
  3982.             movem.l    d1-d7/a0-a6,-(sp)
  3983.  
  3984.           ?_Entry::
  3985.             move.l    (LastFindDirIndexPtr),d0
  3986.             bmi    ?_Err_OS
  3987.             move.l    d0,a1
  3988.             move.l    REQH_FileInfoPtr(a5),a3
  3989.             lea    $24(a3),a3
  3990.  
  3991.           ?_FindNext::
  3992.             moveq.l    #0,d2
  3993.             move.b    EIS9_Adjust(a1),d2
  3994. *            add.l    EIS9_SectorMotorola(a1),d2
  3995.             subq.w    #4,sp
  3996.             move.b    EIS9_SectorMotorola+0(a1),0(sp)
  3997.             move.b    EIS9_SectorMotorola+1(a1),1(sp)
  3998.             move.b    EIS9_SectorMotorola+2(a1),2(sp)
  3999.             move.b    EIS9_SectorMotorola+3(a1),3(sp)
  4000.             add.l    (sp)+,d2
  4001. *            move.l    EIS9_SizeMotorola(a1),d3
  4002.             subq.w    #4,sp
  4003.             move.b    EIS9_SizeMotorola+0(a1),0(sp)
  4004.             move.b    EIS9_SizeMotorola+1(a1),1(sp)
  4005.             move.b    EIS9_SizeMotorola+2(a1),2(sp)
  4006.             move.b    EIS9_SizeMotorola+3(a1),3(sp)
  4007.             move.l    (sp)+,d3
  4008.             addi.l    #$7ff,d3
  4009.             moveq.l    #$0b,d0
  4010.             lsr.l    d0,d3
  4011.             subq.w    #1,d3
  4012.             move.w    (CDROMCacheBufSize),d1
  4013.  
  4014.           ?_ReadNext::
  4015.             moveq.l    #1,d1
  4016.             bsr    ReadCDROMCache
  4017.             tst.w    d0
  4018.             bne    ?_Quit
  4019.  
  4020.           ?_MatchNext::
  4021.             bsr    FindFil_MatchSub
  4022.             tst.l    d0
  4023.             beq    ?_Found
  4024.             moveq.l    #0,d0
  4025.             move.b    EIS9_EntrySize(a1),d0
  4026.             adda.w    d0,a1
  4027.             tst.b    (a1)
  4028.             bne    ?_MatchNext
  4029.             bsr    GetPhysicalCDROM1Sector
  4030.             add.l    d0,d2
  4031.             dbra    d3,?_ReadNext
  4032.  
  4033.           ?_NotFound::
  4034.             moveq.l    #$fe,d0
  4035.             move.l    d0,(ReturnResult)
  4036.             moveq.l    #0,d0
  4037.             bra    ?_Quit
  4038.  
  4039.           ?_Err_OS::
  4040.             moveq.l    #1,d0
  4041.             bra    ?_Quit
  4042.  
  4043.           ?_Err_OpenDir::
  4044.             moveq.l    #$fb,d0
  4045.             move.l    d0,(ReturnResult)
  4046.             moveq.l    #0,d0
  4047.             bra    ?_Quit
  4048.  
  4049.           ?_Found::
  4050.             moveq.l    #0,d0
  4051.             btst.b    #1,EIS9_Atr(a1)
  4052.             bst    ?_Err_OpenDir
  4053.             move.l    d0,(ReturnResult)
  4054.             move.l    a1,(LastFindFileIndexPtr)
  4055.             bsr    ?_MakeFileInfo
  4056.  
  4057.           ?_Quit::
  4058.             movem.l    (sp)+,d1-d7/a0-a6
  4059.             rts
  4060.  
  4061.           ?_MakeFileInfo::
  4062.             movem.l    d0-d7/a0-a6,-(sp)
  4063.             move.l    REQH_FileInfoPtr(a5),a0
  4064.             clr.l    $06(a0)
  4065.             moveq.l    #0,d2
  4066.             move.b    EIS9_Adjust(a1),d2
  4067. *            add.l    EIS9_SectorMotorola(a1),d2
  4068.             subq.w    #4,sp
  4069.             move.b    EIS9_SectorMotorola+0(a1),0(sp)
  4070.             move.b    EIS9_SectorMotorola+1(a1),1(sp)
  4071.             move.b    EIS9_SectorMotorola+2(a1),2(sp)
  4072.             move.b    EIS9_SectorMotorola+3(a1),3(sp)
  4073.             add.l    (sp)+,d2
  4074.             move.l    d2,$14(a0)
  4075.             move.l    d2,$1c(a0)
  4076.             clr.l    $20(a0)
  4077.             move.b    EIS9_Year(a1),d0
  4078.             subi.b    #80,d0
  4079.             lsl.w    #4,d0
  4080.             or.b    EIS9_Month(a1),d0
  4081.             lsl.w    #5,d0
  4082.             or.b    EIS9_Day(a1),d0
  4083.             move.w    d0,$3c(a0)
  4084.             move.b    EIS9_Hour(a1),d0
  4085.             lsl.w    #6,d0
  4086.             or.b    EIS9_Min(a1),d0
  4087.             lsl.l    #6,d0
  4088.             or.b    EIS9_Sec(a1),d0
  4089.             lsr.l    #1,d0
  4090.             move.w    d0,$3a(a0)
  4091. *            move.l    EIS9_SizeMotorola(a1),$40(a0)
  4092.             move.b    EIS9_SizeMotorola+0(a1),$40+0(a0)
  4093.             move.b    EIS9_SizeMotorola+1(a1),$40+1(a0)
  4094.             move.b    EIS9_SizeMotorola+2(a1),$40+2(a0)
  4095.             move.b    EIS9_SizeMotorola+3(a1),$40+3(a0)
  4096.  
  4097.             movem.l    (sp)+,d0-d7/a0-a6
  4098.             rts
  4099.  
  4100.         }
  4101.  
  4102.  
  4103. *************************************************************************
  4104.  
  4105.  
  4106. *    long    CloseFil( void );
  4107. *
  4108. *        ファイルを閉じる。特殊デバイスドライバ用。
  4109. *        in    a5    リクエストヘッダ
  4110. *                REQH_Magic00        常に26
  4111. *                REQH_UnitNo        ユニット番号
  4112. *                REQH_OSFileNamePtr    OSファイル名へのポインタ
  4113. *                REQH_Result        検索結果を返す
  4114. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  4115. *        out    d0    エラーコード
  4116.  
  4117.  
  4118.         @xproc    [ CloseFil ] {
  4119.             @return    [ d0, ErrCode ].l;
  4120.  
  4121.             movem.l    d1-d7/a0-a6,-(sp)
  4122.  
  4123.           ?_Entry::
  4124.             moveq.l    #0,d0
  4125.             move.l    d0,(ReturnResult)
  4126.  
  4127.           ?_Quit::
  4128.             movem.l    (sp)+,d1-d7/a0-a6
  4129.             rts
  4130.  
  4131.  
  4132.         }
  4133.  
  4134.  
  4135. *************************************************************************
  4136.  
  4137.  
  4138. *    long    ReadFil( void );
  4139. *
  4140. *        ファイルを読む。特殊デバイスドライバ用。
  4141. *        in    a5    リクエストヘッダ
  4142. *                REQH_Magic00        常に26
  4143. *                REQH_UnitNo        ユニット番号
  4144. *                REQH_DataBufferPtr    読み込みバッファへのポインタ
  4145. *                REQH_AccessSize        アクセスサイズ
  4146. *                REQH_Result        検索結果を返す
  4147. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  4148. *        out    d0    エラーコード
  4149.  
  4150.  
  4151.         @xproc    [ ReadFil ] {
  4152.             @return    [ d0, ErrCode ].l;
  4153.  
  4154.             movem.l    d1-d7/a0-a6,-(sp)
  4155.  
  4156.           ?_Entry::
  4157.             move.l    REQH_DataBufferPtr(a5),a3
  4158.             move.l    REQH_FileInfoPtr(a5),a0
  4159.             move.l    REQH_AccessSize(a5),d6
  4160.             move.l    $06(a0),d2
  4161.             add.l    d6,d2
  4162.             cmp.l    $40(a0),d2
  4163.             @ifcc    {
  4164.                 move.l    $40(a0),d6
  4165.                 sub.l    $06(a0),d6
  4166.                 move.l    d6,REQH_AccessSize(a5)
  4167.             }
  4168.             tst.l    d6
  4169.             bmi    ?_Err_ReadSize
  4170.             beq    ?_Err_0Read
  4171.  
  4172.           ?_ReadHead::
  4173.             move.l    $1c(a0),d4
  4174.             moveq.l    #0,d5
  4175.             move.w    (CDROM_SectorSize),d0
  4176.             @ifne    {
  4177.                 cmpi.w    #2048,d0
  4178.                 @ifcs    {
  4179.                     move.l    #2048,d0
  4180.                     divu    (CDROM_SectorSize),d0
  4181.                     ext.l    d0
  4182.                     subq.l    #1,d0
  4183.                     move.l    d4,d1
  4184.                     and.l    d0,d1
  4185.                     sub.l    d1,d4
  4186.                     mulu    (CDROM_SectorSize),d1
  4187.                     move.l    d1,d5
  4188.                 }
  4189.             }
  4190.  
  4191.  
  4192.             move.l    $06(a0),d2
  4193.             add.l    d5,d2
  4194.             moveq.l    #0,d0
  4195.             move.w    (CDROM_SectorSize),d0
  4196.             move.l    a0,-(sp)
  4197.             move.l    d0,-(sp)
  4198.             move.l    d2,-(sp)
  4199.             bsr    ___udivsi3
  4200.             addq.w    #8,sp
  4201.             move.l    (sp)+,a0
  4202.             move.l    d0,d2
  4203.             add.l    d4,d2
  4204.             move.l    #2048,d0
  4205.             divu    (CDROM_SectorSize),d0
  4206.             ext.l    d0
  4207.             subq.l    #1,d0
  4208.             not.l    d0
  4209.             and.l    d0,d2
  4210.  
  4211.             move.l    $06(a0),d3
  4212.             add.l    d5,d3
  4213.             andi.l    #$800-1,d3
  4214.             beq    ?_ReadBody
  4215.  
  4216.             moveq.l    #0,d1
  4217.             bsr    ReadCDROMCache
  4218.             tst.w    d0
  4219.             bne    ?_Err_Read
  4220.             add.l    d3,a1
  4221.             eori.w    #$800-1,d3
  4222.             addq.w    #1,d3
  4223.             cmp.l    d6,d3
  4224.             @ifcc    {
  4225.                 move.l    d6,d3
  4226.             }
  4227.             sub.l    d3,d6
  4228.             subq.w    #1,d3
  4229.             @repeat [ d3 ].w {
  4230.                 move.b    (a1)+,(a3)+
  4231.             }
  4232.             move.l    #2048,d0
  4233.             divu    (CDROM_SectorSize),d0
  4234.             ext.l    d0
  4235.             add.l    d0,d2
  4236.  
  4237.           ?_ReadBody::
  4238.             move.l    d6,d3
  4239.             moveq.l    #$0b,d0
  4240.             lsr.l    d0,d3
  4241.             tst.l    d3
  4242.             beq    ?_ReadTail
  4243.             move.l    a3,a1
  4244.             move.l    d2,-(sp)
  4245.             bsr    ConvertCDROMSector
  4246.             bsr    ReadCDROM
  4247.             move.l    (sp)+,d2
  4248.             tst.w    d0
  4249.             bne    ?_Err_Read
  4250.             moveq.l    #$0b,d0
  4251.             lsl.l    d0,d3
  4252.             sub.l    d3,d6
  4253.             add.l    d3,a3
  4254.             move.w    (CDROM_SectorSize),d0
  4255.             movem.l    d2/a0-a2,-(sp)
  4256.             move.l    d0,-(sp)
  4257.             move.l    d3,-(sp)
  4258.             bsr    ___udivsi3
  4259.             addq.w    #8,sp
  4260.             movem.l    (sp)+,d2/a0-a2
  4261.             add.l    d0,d2
  4262.  
  4263.           ?_ReadTail::
  4264.             move.l    d6,d3
  4265.             andi.l    #$800-1,d3
  4266.             beq    ?_ReadOk
  4267.             moveq.l    #0,d1
  4268.             bsr    ReadCDROMCache
  4269.             tst.w    d0
  4270.             bne    ?_Err_Read
  4271.             subq.w    #1,d3
  4272.             @repeat [ d3 ].w {
  4273.                 move.b    (a1)+,(a3)+
  4274.             }
  4275.  
  4276.           ?_ReadOk::
  4277.             move.l    REQH_AccessSize(a5),d0
  4278.             add.l    d0,$06(a0)
  4279.           ?_Err_0Read::
  4280.           ?_Result::
  4281.             moveq.l    #0,d0
  4282.  
  4283.           ?_Err_Read:
  4284.  
  4285.           ?_Quit::
  4286.             movem.l    (sp)+,d1-d7/a0-a6
  4287.             rts
  4288.  
  4289.           ?_Err_ReadSize::
  4290.             moveq.l    #0,d0
  4291.             bra    ?_Result
  4292.  
  4293.         }
  4294.  
  4295.  
  4296. *************************************************************************
  4297.  
  4298.  
  4299. *    long    SeekFil( void );
  4300. *
  4301. *        ファイルのシークを行なう。特殊デバイスドライバ用。
  4302. *        in    a5    リクエストヘッダ
  4303. *                REQH_Magic00        常に26
  4304. *                REQH_UnitNo        ユニット番号
  4305. *                REQH_SeekMode        シークモード
  4306. *                REQH_AccessSize        アクセスサイズ
  4307. *                REQH_Result        検索結果を返す
  4308. *                REQH_FileInfoPtr    ファイル情報へのポインタ
  4309. *        out    d0    エラーコード
  4310.  
  4311.  
  4312.         @xproc    [ SeekFil ] {
  4313.             @return    [ d0, ErrCode ].l;
  4314.  
  4315.             movem.l    d1-d7/a0-a6,-(sp)
  4316.  
  4317.           ?_Entry::
  4318.             move.l    REQH_DataBufferPtr(a5),a3
  4319.             move.l    REQH_FileInfoPtr(a5),a0
  4320.             move.l    REQH_AccessSize(a5),d6
  4321.             move.b    REQH_SeekMode(a5),d0
  4322.             beq    ?_SEEK_SET
  4323.             cmpi.b    #1,d0
  4324.             beq    ?_SEEK_CUR
  4325.             bra    ?_SEEK_END
  4326.  
  4327.           ?_SEEK_CUR::
  4328.             add.l    $06(a0),d6
  4329.  
  4330.           ?_SEEK_SET::
  4331.             cmp.l    $40(a0),d6
  4332.             bhi    ?_Err_Offset
  4333.             move.l    d6,$06(a0)
  4334.             move.l    d6,d0
  4335.             bra    ?_Result
  4336.  
  4337.           ?_SEEK_END::
  4338.             move.l    $40(a0),d0
  4339.             sub.l    d6,d0
  4340.             bcs    ?_Err_Offset
  4341.             move.l    d0,$06(a0)
  4342.             bra    ?_Result
  4343.  
  4344.           ?_Err_Offset::
  4345.             moveq.l    #$e7,d0
  4346.  
  4347.           ?_Result::
  4348.             move.l    d0,REQH_AccessSize(a5)
  4349.             moveq.l    #0,d0
  4350.  
  4351.           ?_Quit::
  4352.             movem.l    (sp)+,d1-d7/a0-a6
  4353.             rts
  4354.  
  4355.  
  4356.         }
  4357.  
  4358.  
  4359. *************************************************************************
  4360.  
  4361.  
  4362. *    long    GetCap( void );
  4363. *
  4364. *        容量を取得する。特殊デバイスドライバ用。
  4365. *        in    a5    リクエストヘッダ
  4366. *                REQH_Magic00        常に26
  4367. *                REQH_UnitNo        ユニット番号
  4368. *                REQH_DataBufferPtr    容量データを返すバッファへのポインタ
  4369. *                REQH_Result        結果を返す
  4370. *        out    d0    エラーコード
  4371.  
  4372.  
  4373.         @xproc    [ GetCap ] {
  4374.             @return    [ d0, ErrCode ].l;
  4375.  
  4376.             movem.l    d1-d7/a0-a6,-(sp)
  4377.  
  4378.           ?_Entry::
  4379.             move.w    #$7002,d0
  4380.             lea    CDROMHeadSecReadBuf,a0
  4381.             move.l    REQH_DataBufferPtr(a5),a1
  4382.             cmpi.b    #1,(a0)
  4383.             @ifeq    {
  4384.                 move.l    $54(a0),d1
  4385.                 lsr.l    #3,d1
  4386.                 move.l    d1,$00(a1)
  4387.                 move.l    #$0008_0800,$04(a1)
  4388.                 moveq.l    #0,d0
  4389.                 move.l    d0,REQH_Result(a5)
  4390.             }
  4391.  
  4392.           ?_Quit::
  4393.             movem.l    (sp)+,d1-d7/a0-a6
  4394.             rts
  4395.  
  4396.  
  4397.         }
  4398.  
  4399.  
  4400. *************************************************************************
  4401.  
  4402.  
  4403. *    long    ReadTOC( void );
  4404. *
  4405. *        TOCを読む。
  4406. *        in    a5    リクエストヘッダ
  4407. *                REQH_Magic00        常に26
  4408. *                REQH_UnitNo        ユニット番号
  4409. *                REQH_DataBufferPtr    データバッファへのポインタ
  4410. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4411. *                REQH_Result        結果を返す
  4412. *        out    d0    エラーコード
  4413.  
  4414.  
  4415.         @xproc    [ ReadTOC ] {
  4416.             @return    [ d0, ErrCode ].l;
  4417.             movem.l    d1-d7/a0-a6,-(sp)
  4418.  
  4419.           ?_Entry::
  4420.             move.l    REQH_DataBufferPtr(a5),a1
  4421.             lea    SCSI_DATABuf,a0
  4422.  
  4423.           ?_Head::
  4424.             moveq.l    #$aa,d0
  4425.             moveq.l    #2,d1
  4426.             bsr    ?_ReadTOCSub
  4427.             tst.w    d0
  4428.             bne    ?_Err_Read
  4429.  
  4430.             move.b    2(a0),d6
  4431.             move.b    d6,(a1)+
  4432.             move.b    3(a0),d7
  4433.             move.b    d7,(a1)+
  4434.             move.l    8(a0),d0
  4435.             lsl.l    #8,d0
  4436.             beq    ?_Err_Read
  4437.             move.l    d0,(a1)+
  4438.  
  4439.           ?_Body::
  4440.             @do {
  4441.                 move.b    d6,d0
  4442.                 moveq.l    #2,d1
  4443.                 bsr    ?_ReadTOCSub
  4444.                 tst.w    d0
  4445.                 bne    ?_Err_Read
  4446.                 move.l    8(a0),d0
  4447.                 lsl.l    #8,d0
  4448.                 beq    ?_Err_Read
  4449.                 move.b    5(a0),d0
  4450.                 lsr.b    #2,d0
  4451.                 andi.b    #1,d0
  4452.                 move.l    d0,(a1)+
  4453.                 addq.b    #1,d6
  4454.                 cmp.b    d7,d6
  4455.             } @while.ls;
  4456.  
  4457.             moveq.l    #0,d0
  4458.             move.l    d0,(ReturnResult)
  4459.  
  4460.           ?_Quit::
  4461.             movem.l    (sp)+,d1-d7/a0-a6
  4462.             rts
  4463.  
  4464.           ?_Err_Read::
  4465.             moveq.l    #$f2,d0
  4466.             move.l    d0,(ReturnResult)
  4467.             moveq.l    #0,d0
  4468.             bra    ?_Quit
  4469.  
  4470.           ?_ReadTOCSub::
  4471.             move.b    d0,(?_Data2)
  4472.             move.b    d1,(?_Data+1)
  4473.             pea    SCSI_DATABuf
  4474.             move.l    #12,-(sp)
  4475.             clr.l    -(sp)
  4476.             clr.l    -(sp)
  4477.             pea    ?_Data(pc)
  4478.             move.l    #10,-(sp)
  4479.             bsr    SCSI_SELECT
  4480.             lea    24(sp),sp
  4481.             rts
  4482.           ?_Data::
  4483.             dc.b    $43,$02,$00,$00,$00,$00
  4484.           ?_Data2::
  4485.             dc.b    $aa,$00,$0c,$00
  4486.  
  4487.         }
  4488.  
  4489.  
  4490. *************************************************************************
  4491.  
  4492.  
  4493. *    long    ReadTOC2( void );
  4494. *
  4495. *        TOCを読む。
  4496. *        in    a5    リクエストヘッダ
  4497. *                REQH_Magic00        常に26
  4498. *                REQH_UnitNo        ユニット番号
  4499. *                REQH_DataBufferPtr    データバッファへのポインタ
  4500. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4501. *                REQH_Result        結果を返す
  4502. *        out    d0    エラーコード
  4503.  
  4504.  
  4505.         @xproc    [ ReadTOC2 ] {
  4506.             @return    [ d0, ErrCode ].l;
  4507.             movem.l    d1-d7/a0-a6,-(sp)
  4508.  
  4509.           ?_Entry::
  4510.             move.l    REQH_DataBufferPtr(a5),a1
  4511.             lea    SCSI_DATABuf,a0
  4512.  
  4513.           ?_Head::
  4514.             moveq.l    #$aa,d0
  4515.             moveq.l    #2,d1
  4516.             bsr    ReadTOC_ReadTOCSub
  4517.             tst.w    d0
  4518.             bne    ReadTOC_Err_Read
  4519.  
  4520.             move.w    2(a0),(a1)
  4521.  
  4522.             moveq.l    #0,d0
  4523.             move.l    d0,(ReturnResult)
  4524.  
  4525.           ?_Quit::
  4526.             movem.l    (sp)+,d1-d7/a0-a6
  4527.             rts
  4528.  
  4529.         }
  4530.  
  4531.  
  4532. *************************************************************************
  4533.  
  4534.  
  4535. *    long    ReadTOC3( void );
  4536. *
  4537. *        TOCを読む。
  4538. *        in    a5    リクエストヘッダ
  4539. *                REQH_Magic00        常に26
  4540. *                REQH_UnitNo        ユニット番号
  4541. *                REQH_DataBufferPtr    データバッファへのポインタ
  4542. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4543. *                REQH_Result        結果を返す
  4544. *        out    d0    エラーコード
  4545.  
  4546.  
  4547.         @xproc    [ ReadTOC3 ] {
  4548.             @return    [ d0, ErrCode ].l;
  4549.             movem.l    d1-d7/a0-a6,-(sp)
  4550.  
  4551.           ?_Entry::
  4552.             move.l    REQH_DataBufferPtr(a5),a1
  4553.             lea    SCSI_DATABuf,a0
  4554.  
  4555.           ?_Head::
  4556.             moveq.l    #$aa,d0
  4557.             moveq.l    #2,d1
  4558.             bsr    ReadTOC_ReadTOCSub
  4559.             tst.w    d0
  4560.             bne    ReadTOC_Err_Read
  4561.  
  4562.             move.b    2(a0),d6
  4563.             move.b    3(a0),d7
  4564.             move.l    8(a0),d0
  4565.             lsl.l    #8,d0
  4566.             beq    ReadTOC_Err_Read
  4567.             move.l    d0,(a1)+
  4568.  
  4569.             bra    ReadTOC_Body
  4570.  
  4571.         }
  4572.  
  4573.  
  4574. *************************************************************************
  4575.  
  4576.  
  4577. *    long    FindDataTOC( void );
  4578. *
  4579. *        TOCからデータトラックを探す。
  4580. *        in    なし
  4581. *        out    d0    CD-ROMデータアドレス
  4582. *                負でエラーコード
  4583.  
  4584.  
  4585.         @xproc    [ FindDataTOC ] {
  4586.             @return    [ d0, ErrCode ].l;
  4587.             movem.l    d1-d7/a0-a6,-(sp)
  4588.  
  4589.           ?_Entry::
  4590.             lea    SCSI_DATABuf,a0
  4591.             clr.l    (FindDataTOC_DataAddress)
  4592.             clr.b    (FindDataTOC_TrackNo)
  4593.             clr.b    (FindDataTOC_StartTrackNo)
  4594.             clr.b    (FindDataTOC_EndTrackNo)
  4595.  
  4596.           ?_Head::
  4597.             moveq.l    #$aa,d0
  4598.             moveq.l    #0,d1
  4599.             bsr    ReadTOC_ReadTOCSub
  4600.             tst.w    d0
  4601.             bne    ?_Err_Read
  4602.  
  4603.             move.b    2(a0),d6
  4604.             move.b    3(a0),d7
  4605.             move.l    8(a0),d0
  4606.             move.b    d6,(FindDataTOC_TrackNo)
  4607.             move.b    d6,(FindDataTOC_StartTrackNo)
  4608.             move.b    d7,(FindDataTOC_EndTrackNo)
  4609.  
  4610.           ?_Body::
  4611.             @while [ cmp.b d7,d6 ].ls {
  4612.                 move.b    d6,d0
  4613.                 moveq.l    #0,d1
  4614.                 bsr    ReadTOC_ReadTOCSub
  4615.                 tst.w    d0
  4616.                 bne    ?_Err_Read
  4617.                 move.l    8(a0),d1
  4618.                 move.b    5(a0),d0
  4619.                 lsr.b    #2,d0
  4620.                 andi.b    #1,d0
  4621.                 bst    ?_Found
  4622.                 addq.b    #1,d6
  4623.             }
  4624.  
  4625.           ?_NotFound::
  4626.             moveq.l    #$ff,d0
  4627.             bra    ?_Quit
  4628.  
  4629.           ?_Err_Read::
  4630.             moveq.l    #$f2,d0
  4631.             bra    ?_Quit
  4632.  
  4633.           ?_Found::
  4634.             move.l    d1,d0
  4635.             move.l    d0,(FindDataTOC_DataAddress)
  4636.             addq.b    #1,d6
  4637.  
  4638.           ?_Quit::
  4639.             move.b    d6,(FindDataTOC_TrackNo)
  4640.             movem.l    (sp)+,d1-d7/a0-a6
  4641.             rts
  4642.  
  4643.         }
  4644.  
  4645. *    long    FindDataTOCNext( void );
  4646. *
  4647. *        TOCから次のデータトラックを探す。
  4648. *        in    なし
  4649. *        out    d0    CD-ROMデータアドレス
  4650. *                負でエラーコード
  4651.  
  4652.  
  4653.         @xproc    [ FindDataTOCNext ] {
  4654.             @return    [ d0, ErrCode ].l;
  4655.             movem.l    d1-d7/a0-a6,-(sp)
  4656.  
  4657.           ?_Entry::
  4658.             lea    SCSI_DATABuf,a0
  4659.  
  4660.           ?_Head::
  4661.             move.b    (FindDataTOC_TrackNo),d6
  4662.             move.b    (FindDataTOC_EndTrackNo),d7
  4663.             bra    FindDataTOC_Body
  4664.  
  4665.         }
  4666.  
  4667.  
  4668. *************************************************************************
  4669.  
  4670.  
  4671. *    long    PlayAudio( void );
  4672. *
  4673. *        オーディオ再生を行なう。
  4674. *        in    a5    リクエストヘッダ
  4675. *                REQH_Magic00        常に26
  4676. *                REQH_UnitNo        ユニット番号
  4677. *                REQH_DataBufferPtr    データバッファへのポインタ
  4678. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4679. *                REQH_Result        結果を返す
  4680. *        out    d0    エラーコード
  4681.  
  4682.  
  4683.         @xproc    [ PlayAudio ] {
  4684.             tst.b    (ReqSendPlayAudioAdrFlag)
  4685.             bcl    PlayAudioMSF
  4686.             bra    PlayAudioAdr
  4687.         }
  4688.  
  4689.  
  4690. *************************************************************************
  4691.  
  4692.  
  4693. *    long    PlayAudioMSF( void );
  4694. *
  4695. *        オーディオ再生を行なう。
  4696. *        in    a5    リクエストヘッダ
  4697. *                REQH_Magic00        常に26
  4698. *                REQH_UnitNo        ユニット番号
  4699. *                REQH_DataBufferPtr    データバッファへのポインタ
  4700. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4701. *                REQH_Result        結果を返す
  4702. *        out    d0    エラーコード
  4703.  
  4704.  
  4705.         @xproc    [ PlayAudioMSF ] {
  4706.             @return    [ d0, ErrCode ].l;
  4707.             movem.l    d1-d7/a0-a6,-(sp)
  4708.  
  4709.           ?_Entry::
  4710.             move.l    REQH_DataBufferPtr(a5),a1
  4711.             lea    ?_Data2(pc),a0
  4712.             move.b    (a1)+,(a0)+
  4713.             move.b    (a1)+,(a0)+
  4714.             move.b    (a1)+,(a0)+
  4715.             addq.w    #1,a1
  4716.             move.b    (a1)+,(a0)+
  4717.             move.b    (a1)+,(a0)+
  4718.             move.b    (a1)+,(a0)+
  4719.  
  4720.             pea    SCSI_DATABuf
  4721.             clr.l    -(sp)
  4722.             clr.l    -(sp)
  4723.             clr.l    -(sp)
  4724.             pea    ?_Data(pc)
  4725.             move.l    #10,-(sp)
  4726.             bsr    SCSI_SELECT
  4727.             lea    24(sp),sp
  4728.             tst.w    d0
  4729.             bne    ?_Err_Read
  4730.             moveq.l    #0,d0
  4731.             move.l    d0,(ReturnResult)
  4732.  
  4733.           ?_Quit::
  4734.             movem.l    (sp)+,d1-d7/a0-a6
  4735.             rts
  4736.  
  4737.           ?_Err_Read::
  4738.             moveq.l    #$f2,d0
  4739.             move.l    d0,(ReturnResult)
  4740.             moveq.l    #0,d0
  4741.             bra    ?_Quit
  4742.  
  4743.           ?_Data::
  4744.             dc.b    $47,$00,$00
  4745.           ?_Data2::
  4746.             dc.b    $00,$00,$00,$00,$00,$00,$00
  4747.  
  4748.         }
  4749.  
  4750.  
  4751. *************************************************************************
  4752.  
  4753.  
  4754. *    long    PlayAudioAdr( void );
  4755. *
  4756. *        オーディオ再生を行なう。
  4757. *        in    a5    リクエストヘッダ
  4758. *                REQH_Magic00        常に26
  4759. *                REQH_UnitNo        ユニット番号
  4760. *                REQH_DataBufferPtr    データバッファへのポインタ
  4761. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4762. *                REQH_Result        結果を返す
  4763. *        out    d0    エラーコード
  4764.  
  4765.  
  4766.         @xproc    [ PlayAudioAdr ] {
  4767.             @return    [ d0, ErrCode ].l;
  4768.             movem.l    d1-d7/a0-a6,-(sp)
  4769.  
  4770.           ?_Entry::
  4771.             move.l    REQH_DataBufferPtr(a5),a1
  4772.             lea    ?_Data2(pc),a0
  4773.             moveq.l    #0,d0
  4774.             moveq.l    #0,d1
  4775.             moveq.l    #0,d2
  4776.             move.b    (a1)+,d1
  4777.             mulu    #60,d1
  4778.             move.b    (a1)+,d0
  4779.             add.l    d0,d1
  4780.             subq.l    #2,d1
  4781.             mulu    #75,d1
  4782.             move.b    (a1)+,d0
  4783.             add.l    d0,d1
  4784.             rol.l    #8,d1
  4785.             move.b    d1,(a0)+
  4786.             rol.l    #8,d1
  4787.             move.b    d1,(a0)+
  4788.             rol.l    #8,d1
  4789.             move.b    d1,(a0)+
  4790.             rol.l    #8,d1
  4791.             move.b    d1,(a0)+
  4792.             addq.w    #1,a1
  4793.             move.b    (a1)+,d2
  4794.             mulu    #60,d2
  4795.             move.b    (a1)+,d0
  4796.             add.l    d0,d2
  4797.             subq.l    #2,d2
  4798.             mulu    #75,d2
  4799.             sub.l    d1,d2
  4800.             rol.l    #8,d2
  4801.             move.b    d2,(a0)+
  4802.             rol.l    #8,d2
  4803.             move.b    d2,(a0)+
  4804.             rol.l    #8,d2
  4805.             move.b    d2,(a0)+
  4806.             rol.l    #8,d2
  4807.             move.b    d2,(a0)+
  4808.  
  4809.             pea    SCSI_DATABuf
  4810.             clr.l    -(sp)
  4811.             clr.l    -(sp)
  4812.             clr.l    -(sp)
  4813.             pea    ?_Data(pc)
  4814.             move.l    #12,-(sp)
  4815.             bsr    SCSI_SELECT
  4816.             lea    24(sp),sp
  4817.             tst.w    d0
  4818.             bne    ?_Err_Read
  4819.             moveq.l    #0,d0
  4820.             move.l    d0,(ReturnResult)
  4821.  
  4822.           ?_Quit::
  4823.             movem.l    (sp)+,d1-d7/a0-a6
  4824.             rts
  4825.  
  4826.           ?_Err_Read::
  4827.             moveq.l    #$f2,d0
  4828.             move.l    d0,(ReturnResult)
  4829.             moveq.l    #0,d0
  4830.             bra    ?_Quit
  4831.  
  4832.           ?_Data::
  4833.             dc.b    $A5,$00
  4834.           ?_Data2::
  4835.             dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  4836.  
  4837.         }
  4838.  
  4839.  
  4840. *************************************************************************
  4841.  
  4842.  
  4843. *    long    StopAudio( void );
  4844. *
  4845. *        オーディオ再生停止を行なう。
  4846. *        in    a5    リクエストヘッダ
  4847. *                REQH_Magic00        常に26
  4848. *                REQH_UnitNo        ユニット番号
  4849. *                REQH_DataBufferPtr    データバッファへのポインタ
  4850. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4851. *                REQH_Result        結果を返す
  4852. *        out    d0    エラーコード
  4853.  
  4854.  
  4855.         @xproc    [ StopAudio ] {
  4856.             @return    [ d0, ErrCode ].l;
  4857.             movem.l    d1-d7/a0-a6,-(sp)
  4858.  
  4859.           ?_Entry::
  4860.             move.l    (SCSI_ID),d4
  4861.             andi.l    #$0007ffff,d4
  4862.  .if 0
  4863.             moveq.l    #0,d3
  4864.             SCSI    _S_STARTSTOP
  4865.  .endif
  4866.             moveq.l    #1,d3
  4867.             SCSI    _S_STARTSTOP
  4868.             moveq.l    #0,d0
  4869.             move.l    d0,(ReturnResult)
  4870.  
  4871.           ?_Quit::
  4872.             movem.l    (sp)+,d1-d7/a0-a6
  4873.             rts
  4874.  
  4875.  
  4876.         }
  4877.  
  4878.  
  4879. *************************************************************************
  4880.  
  4881.  
  4882. *    long    PauseResume( void );
  4883. *
  4884. *        オーディオのポーズを行なう。
  4885. *        in    a5    リクエストヘッダ
  4886. *                REQH_Magic00        常に26
  4887. *                REQH_UnitNo        ユニット番号
  4888. *                REQH_DataBufferPtr    データバッファへのポインタ
  4889. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4890. *                REQH_Result        結果を返す
  4891. *        out    d0    エラーコード
  4892.  
  4893.  
  4894.         @xproc    [ PauseResume ] {
  4895.             @return    [ d0, ErrCode ].l;
  4896.             movem.l    d1-d7/a0-a6,-(sp)
  4897.  
  4898.           ?_Entry::
  4899.             move.l    REQH_DataBufferPtr(a5),a1
  4900.             lea    ?_Data2(pc),a0
  4901.             move.l    (a1),d0
  4902.             move.b    d0,(a0)
  4903.  
  4904.             pea    SCSI_DATABuf
  4905.             clr.l    -(sp)
  4906.             clr.l    -(sp)
  4907.             clr.l    -(sp)
  4908.             pea    ?_Data(pc)
  4909.             move.l    #10,-(sp)
  4910.             bsr    SCSI_SELECT
  4911.             lea    24(sp),sp
  4912.             tst.w    d0
  4913.             bne    ?_Err_Read
  4914.             moveq.l    #0,d0
  4915.             move.l    d0,(ReturnResult)
  4916.  
  4917.           ?_Quit::
  4918.             movem.l    (sp)+,d1-d7/a0-a6
  4919.             rts
  4920.  
  4921.           ?_Err_Read::
  4922.             moveq.l    #$f2,d0
  4923.             move.l    d0,(ReturnResult)
  4924.             moveq.l    #0,d0
  4925.             bra    ?_Quit
  4926.  
  4927.           ?_Data::
  4928.             dc.b    $4b,$00,$00,$00,$00,$00,$00,$00
  4929.           ?_Data2::
  4930.             dc.b    $00,$00
  4931.  
  4932.         }
  4933.  
  4934.  
  4935. *************************************************************************
  4936.  
  4937.  
  4938. *    long    ReadSubChannel( void );
  4939. *
  4940. *        サブチャネルデータを読む。
  4941. *        in    a5    リクエストヘッダ
  4942. *                REQH_Magic00        常に26
  4943. *                REQH_UnitNo        ユニット番号
  4944. *                REQH_DataBufferPtr    データバッファへのポインタ
  4945. *                REQH_SPIOCTRLCmd    内部コマンド番号
  4946. *                REQH_Result        結果を返す
  4947. *        out    d0    エラーコード
  4948.  
  4949.  
  4950.         @xproc    [ ReadSubChannel ] {
  4951.             @return    [ d0, ErrCode ].l;
  4952.             movem.l    d1-d7/a0-a6,-(sp)
  4953.  
  4954.           ?_Entry::
  4955.             move.l    REQH_DataBufferPtr(a5),a1
  4956.             lea    SCSI_DATABuf,a0
  4957.  
  4958.             move.l    a0,-(sp)
  4959.             move.l    #$10,-(sp)
  4960.             clr.l    -(sp)
  4961.             clr.l    -(sp)
  4962.             pea    ?_Data(pc)
  4963.             move.l    #10,-(sp)
  4964.             bsr    SCSI_SELECT
  4965.             lea    24(sp),sp
  4966.             tst.w    d0
  4967.             bne    ?_Err_Read
  4968.  
  4969.             move.b    $01(a0),d0
  4970.             beq    ?_1
  4971.             cmpi.b    #$14,d0
  4972.             bcc    ?_1
  4973.             cmpi.b    #$13,d0
  4974.             bcs    ?_2
  4975.             subq.w    #1,d0
  4976.           ?_2::
  4977.             subi.b    #$11,d0
  4978.             bra    ?_3
  4979.           ?_1::
  4980.             moveq.l    #1,d0
  4981.           ?_3::
  4982.             move.b    d0,(a1)+
  4983.             move.b    $07(a0),(a1)+
  4984.             move.b    $06(a0),(a1)+
  4985.             move.b    $0c(a0),(a1)+
  4986.             move.b    $0d(a0),(a1)+
  4987.             move.b    $0e(a0),(a1)+
  4988.             addq.w    #1,a1
  4989.             move.b    $08(a0),(a1)+
  4990.             move.b    $09(a0),(a1)+
  4991.             move.b    $0a(a0),(a1)+
  4992.  
  4993.             moveq.l    #0,d0
  4994.             move.l    d0,(ReturnResult)
  4995.  
  4996.           ?_Quit::
  4997.             movem.l    (sp)+,d1-d7/a0-a6
  4998.             rts
  4999.  
  5000.           ?_Err_Read::
  5001.             moveq.l    #$f2,d0
  5002.             move.l    d0,(ReturnResult)
  5003.             moveq.l    #0,d0
  5004.             bra    ?_Quit
  5005.  
  5006.           ?_Data::
  5007.             dc.b    $42,$02,$40,$01,$00,$00,$00,$00,$10,$00
  5008.  
  5009.         }
  5010.  
  5011.  
  5012. *************************************************************************
  5013.  
  5014.  
  5015. *    long    DrvCtrl( void );
  5016. *
  5017. *        ドライブコントロールを行なう。
  5018. *        in    a5    リクエストヘッダ
  5019. *                REQH_Magic00        常に26
  5020. *                REQH_UnitNo        ユニット番号
  5021. *                REQH_InnerCmd        内部コマンド
  5022. *                REQH_DriveStatus    ドライブの状態を返す
  5023. *        out    d0    エラーコード
  5024.  
  5025.  
  5026.         @xproc    [ DrvCtrl ] {
  5027.             @return    [ d0, ErrCode ].l;
  5028.             movem.l    d1-d7/a0-a6,-(sp)
  5029.  
  5030.           ?_Entry::
  5031.             move.b    REQH_InnerCmd(a5),d0
  5032.             @switch [ d0 ].b {
  5033.               @case    #1:
  5034.                 bsr    ?_Eject
  5035.                 bra    ?_AskExchangeMedia
  5036.               @case    #2:
  5037.                 move.w    (FormatType),d0
  5038.                 @ifpl    {
  5039.                     st.b    (DisableUserEjectFlag)
  5040.                     bsr    ?_SetMediaEjectSwitch
  5041.                 }
  5042.                 bra    ?_AskExchangeMedia
  5043.               @case    #3:
  5044.                 clr.b    (DisableUserEjectFlag)
  5045.                 bsr    ?_SetMediaEjectSwitch
  5046.                 bra    ?_AskExchangeMedia
  5047.               @case    #6:
  5048.                 move.w    (FormatType),d0
  5049.                 @ifpl    {
  5050.                     st.b    (DisableOSEjectFlag)
  5051.                     bsr    ?_SetMediaEjectSwitch
  5052.                 }
  5053.                 bra    ?_AskExchangeMedia
  5054.               @case    #7:
  5055.                 clr.b    (DisableOSEjectFlag)
  5056.                 bsr    ?_SetMediaEjectSwitch
  5057.                 bra    ?_AskExchangeMedia
  5058.  
  5059.               @case    #9:
  5060.  .if 0    * 挿入時だけ遅延処理、非挿入時はリアルタイム
  5061.                 tst.b    (ReqRemakeDPB)
  5062.                 bcl    ?_AskExchangeMedia_Time
  5063.                 tst.b    (ReqAskSCSIConnect)
  5064.                 bst    ?_AskExchangeMedia_Time
  5065.                 bra    ?_AskExchangeMedia
  5066.  .else    * 常に遅延処理
  5067.                 bra    ?_AskExchangeMedia_Time
  5068.  .endif
  5069.  
  5070.               @default:
  5071.                 cmpi.b    #8+1,d0
  5072.                 @ifcc    {
  5073.                     moveq.l    #$ff,d0
  5074.                     bra    ?_e
  5075.                 }
  5076.                 @break;
  5077.  
  5078.             }
  5079.  
  5080.             tst.b    (ReqRemakeDPB)
  5081.             bst    ?_GetStatus
  5082.             tst.w    (FormatType)
  5083.             bmi    ?_GetStatus
  5084.  
  5085.           ?_AskExchangeMedia_Time::
  5086.             bsr    GetTime
  5087.             move.l    (LastAccessTime),d2
  5088.             move.l    (LastAccessDate),d3
  5089.             sub.l    d3,d1
  5090.             @ifne    {
  5091.                 add.l    #8640000,d0
  5092.             }
  5093.             sub.l    d2,d0
  5094.             tst.b    (ReqRemakeDPB)
  5095.             @ifst    {
  5096.                 cmp.l    (SpOption_TIN),d0
  5097.             } @else {
  5098.                 cmp.l    (SpOption_TEJ),d0
  5099.             }
  5100.             bcs    ?_GetStatus
  5101.  
  5102.           ?_AskExchangeMedia::
  5103.             bsr    AskExchangeMedia
  5104.  
  5105.           ?_GetTime::
  5106.             bsr    GetTime
  5107.             move.l    d0,(LastAccessTime)
  5108.             move.l    d1,(LastAccessDate)
  5109.           ?_GetStatus::
  5110.             moveq.l    #$42,d0
  5111.             tst.b    (ReqRemakeDPB)
  5112.             @ifst    {
  5113.                 bclr    #1,d0
  5114.                 bset    #2,d0
  5115.             }
  5116.             tst.w    (FormatType)
  5117.             @ifmi    {
  5118.                 bset    #0,d0
  5119.             }
  5120.             tst.b    (SCSI_RemovableFlag)
  5121.             @ifst    {
  5122.                 bclr    #6,d0
  5123.             }
  5124.             tst.b    (SCSI_WriteProtectFlag)
  5125.             @ifst    {
  5126.                 bset    #3,d0
  5127.             }
  5128.             tst.b    (ForceProtectFlag)
  5129.             @ifst    {
  5130.                 bset    #3,d0
  5131.             }
  5132.             btst    #1,d0
  5133.             @ifcl    {
  5134.                 bclr    #3,d0
  5135.             }
  5136.             move.b    REQH_UnitNo(a5),d1
  5137.             cmp.b    (DPBCount),d1
  5138.             @ifcc    {
  5139.                 bclr    #1,d0
  5140.                 bset    #2,d0
  5141.             }
  5142.             move.b    REQH_InnerCmd(a5),d1
  5143.             @ifne    {
  5144.                 bclr    #2,d0
  5145.                 bclr    #3,d0
  5146.             }
  5147.             cmpi.b    #8,d1
  5148.             @ifeq    {
  5149.                 moveq.l    #-1,d0
  5150.                 tst.b    (LastExchangeFlag)
  5151.                 @ifst    {
  5152.                     moveq.l    #-1,d0
  5153.                 }
  5154.                 move.b    (ReqRemakeDPB),(LastExchangeFlag)
  5155.             }
  5156.             cmpi.b    #9,d1
  5157.             @ifeq    {
  5158.                 bset    #1,d0
  5159.                 bclr    #2,d0
  5160.                 tst.b    (RealEjectedFlag)
  5161.                 @ifst    {
  5162.                     moveq.l    #0,d0
  5163.                 }
  5164.             }
  5165.  
  5166.           ?_e::
  5167.             move.b    d0,REQH_DriveStatus(a5)
  5168.             moveq.l    #0,d0
  5169.             bra    ?_Quit
  5170.  
  5171.           ?_Quit::
  5172.             movem.l    (sp)+,d1-d7/a0-a6
  5173.             rts
  5174.  
  5175.           ?_Eject::
  5176.             move.b    (DisableUserEjectFlag),d0
  5177.             or.b    (DisableOSEjectFlag),d0
  5178.             @ifeq    {
  5179.                 tst.b    (SCSI_RemovableFlag)
  5180.                 @ifst    {
  5181.                     bsr    ?_Eject_Core
  5182.                 }
  5183.             }
  5184.             rts
  5185.  
  5186.           ?_Eject_Core::
  5187.             move.l    (SCSI_ID),d4
  5188.             andi.l    #$0007ffff,d4
  5189.             SCSI    _S_TESTUNIT
  5190.             tst.l    d0
  5191.             @ifeq    {
  5192.                 moveq.l    #0,d3
  5193.                 SCSI    _S_PAMEDIUM
  5194.                 lea    SCSI_REQUESTBuf,a1
  5195.                 moveq.l    #$10,d3
  5196.                 SCSI    _S_REQUEST
  5197.                 moveq.l    #2,d3
  5198.                 SCSI    _S_STARTSTOP
  5199.                 tst.l    d0
  5200.                 @ifne    {
  5201.                     tst.b    (SCSI_CZ6MO1Flag)
  5202.                     @ifst    {
  5203.                         moveq.l    #0,d3
  5204.                         SCSI    _S_EJECT6MO1
  5205.                     }
  5206.                 }
  5207.                 moveq.l    #1,d3
  5208.                 SCSI    _S_REZEROUNIT
  5209.             }
  5210.             rts
  5211.  
  5212.           ?_SetMediaEjectSwitch::
  5213.             move.l    (SCSI_ID),d4
  5214.             andi.l    #$0007ffff,d4
  5215.             SCSI    _S_TESTUNIT
  5216.             tst.l    d0
  5217.             @ifeq    {
  5218.                 moveq.l    #0,d3
  5219.                 move.b    (DisableUserEjectFlag),d0
  5220.                 or.b    (DisableOSEjectFlag),d0
  5221.                 @ifst    {
  5222.                     moveq.l    #1,d3
  5223.                 }
  5224.                 SCSI    _S_PAMEDIUM
  5225.             }
  5226.             rts
  5227.  
  5228.         }
  5229.  
  5230.  
  5231. *************************************************************************
  5232.  
  5233.  
  5234. *    long    RemakeDPB( void );
  5235. *
  5236. *        DPBを再構築する。
  5237. *        in    なし
  5238. *        out    d0    エラーコード
  5239.  
  5240.  
  5241.         @xproc    [ RemakeDPB ] {
  5242.             @return    [ d0, ErrCode ].l;
  5243.  
  5244.             movem.l    d1-d7/a0-a6,-(sp)
  5245.  
  5246.             tst.b    (ForceEjectFlag)
  5247.             bst    ?_ForceEject
  5248.  
  5249.             bsr    FlushCDROMCache
  5250.  
  5251.           ?_Entry::
  5252.             clr.b    (RemakeDPBRetryFlag)
  5253.             st.b    (SCSI_RemovableFlag)
  5254.             st.b    (RealEjectedFlag)
  5255.  
  5256.           ?_Retrylp::
  5257.             clr.b    (DPBCount)
  5258.             move.w    #SDD_FormatType_ERROR3,(FormatType)
  5259.  
  5260.             * レディ確認
  5261.             move.l    (SCSI_ID),d4
  5262.             andi.l    #$0007ffff,d4
  5263.             tst.b    (ReqSendRezeroUnit)
  5264.             @ifst    {
  5265.                 clr.b    (ReqSendRezeroUnit)
  5266.                 tst.b    (SCSI_NoREZEROUNITFlag)
  5267.                 @ifcl    {
  5268.                     moveq.l    #1,d3
  5269.                     SCSI    _S_REZEROUNIT
  5270.                 }
  5271.             }
  5272.             SCSI    _S_TESTUNIT    * エラーステータスを消すためダミー発行
  5273.             tst.l    d0
  5274.             bmi    ?_UnreadyMedia
  5275.  
  5276.             * Inquiry情報取得
  5277.             lea    SCSI_INQUIRYBuf,a1
  5278.             move.l    #$24,d3
  5279.             SCSI    _S_INQUIRY
  5280.             tst.l    d0
  5281.             bne    ?_UnreadyMedia
  5282.  
  5283.             * デバイスタイプ判別
  5284.             move.b    2(a1),(SCSI_Version)
  5285.             move.b    0(a1),d0
  5286.             andi.b    #$1f,d0
  5287.             move.b    d0,(SCSI_DeviceType)
  5288.             @switch [ d0 ].b {
  5289.               @case    #$00:
  5290.               @case    #$07:
  5291.                 move.w    #$4040,(DEVH_Flag+__SUSIEDEVH)
  5292.                 moveq.l    #0,d0
  5293.                 @break;
  5294.               @case    #$05:
  5295.                 move.w    #$2040,(DEVH_Flag+__SUSIEDEVH)
  5296.                 moveq.l    #1,d0
  5297.                 @break;
  5298.               @default:
  5299.                 bra    ?_Unready
  5300.             }
  5301.             move.w    (SDDMode),d1
  5302.             move.w    d0,(SDDMode)
  5303.             cmp.w    d1,d0
  5304.             @ifne    {
  5305.                 bsr    InitDPB
  5306.             }
  5307.             tst.b    1(a1)
  5308.             smi    (SCSI_RemovableFlag)
  5309.             clr.b    (SCSI_CZ6MO1Flag)
  5310.             @if [ cmpi.l #'SHAR',8(a1) ].eq {
  5311.                 st.b    (SCSI_CZ6MO1Flag)
  5312.             }
  5313.  
  5314.             move.w    #SDD_FormatType_ERROR,(FormatType)
  5315.  
  5316.             * レディ再確認
  5317.             SCSI    _S_TESTUNIT
  5318.             tst.l    d0
  5319.             bne    ?_UnreadyMedia
  5320.  
  5321.             * 容量取得
  5322.             lea    SCSI_READCAPBuf,a1
  5323.             SCSI    _S_READCAP
  5324.             tst.l    d0
  5325.             bne    ?_UnreadyMedia
  5326.             move.l    0(a1),(SCSI_TotalBlock)
  5327.             move.l    4(a1),d0
  5328.             @switch [ d0 ].l {
  5329.               @case    #256:
  5330.                 moveq.l    #0,d1
  5331.                 @break;
  5332.               @case    #512:
  5333.                 moveq.l    #1,d1
  5334.                 @break;
  5335.               @case    #1024:
  5336.                 moveq.l    #2,d1
  5337.                 @break;
  5338.               @case    #2048:
  5339.                 moveq.l    #3,d1
  5340.                 @break;
  5341.               @default:
  5342.                 bra    ?_Unready
  5343.             }
  5344.             move.w    d0,(SCSI_BlockCapacityByte)
  5345.             move.b    d1,(SCSI_BlockCapacity)
  5346.  
  5347.             * 容量に応じて強制的にRWEXTを使用するように設定する
  5348.             cmpi.l    #$200000,(SCSI_TotalBlock)
  5349.             @ifcc    {
  5350.                 * TotalBlockが$200000以上の場合はRWEXTが必須
  5351.                 move.b    #1,(SCSI_TestRWEXTFlag)
  5352.             }
  5353.  
  5354.             * モードセンス(Page $3F)よりライトプロテクト情報を取得
  5355.             lea    SCSI_MODESENSEBuf,a1
  5356.             moveq.l    #$3f,d2
  5357.             moveq.l    #32,d3
  5358.             moveq.l    #0,d5
  5359.             move.b    (SCSI_BlockCapacity),d5
  5360.             SCSI    _S_MODESENSE
  5361.             tst.l    d0
  5362.             bne    ?_UnreadyMedia
  5363.             tst.b    2(a1)
  5364.             smi    (SCSI_WriteProtectFlag)
  5365.             tst.b    (ForceProtectFlag)
  5366.             @ifst    {
  5367.                 st.b    (SCSI_WriteProtectFlag)
  5368.             }
  5369.  
  5370.             * モードセンス(Page $03,$04)よりシリンダサイズ情報を取得
  5371.             move.w    #$200,(SCSI_CylinderSize)
  5372.             lea    SCSI_MODESENSEBuf,a1
  5373.             moveq.l    #$03,d2
  5374.             moveq.l    #32,d3
  5375.             moveq.l    #0,d5
  5376.             move.b    (SCSI_BlockCapacity),d5
  5377.             SCSI    _S_MODESENSE
  5378.             tst.l    d0
  5379.             @ifeq    {
  5380.                 move.w    $16(a1),d6
  5381.                 moveq.l    #$04,d2
  5382.                 SCSI    _S_MODESENSE
  5383.                 tst.l    d0
  5384.                 @ifeq    {
  5385.                     * ModeSense3(Sector/Track)×ModeSense4(Head)
  5386.                     moveq.l    #0,d0
  5387.                     move.b    $11(a1),d0
  5388.                     mulu    d6,d0
  5389.                     move.w    d0,(SCSI_CylinderSize)
  5390.                     * TotalBlock÷ModeSense4(Cylinder)
  5391.                     move.l    $04(a1),d0
  5392.                     @ifeq    {
  5393.                         move.l    (SCSI_TotalBlock),d0
  5394.                     }
  5395.                     moveq.l    #0,d1
  5396.                     move.w    $0e(a1),d1
  5397.                     lsl.l    #8,d1
  5398.                     move.b    $10(a1),d1
  5399.                     tst.l    d1
  5400.                     @ifne    {
  5401.                         movem.l    d2-d7/a0-a6,-(sp)
  5402.                         move.l    d1,-(sp)
  5403.                         move.l    d0,-(sp)
  5404.                         bsr    ___udivsi3
  5405.                         addq.w    #8,sp
  5406.                         movem.l    (sp)+,d2-d7/a0-a6
  5407.                     } @else {
  5408.                         moveq.l    #0,d0
  5409.                     }
  5410.                     move.w    d0,(SCSI_CylinderSize2)
  5411.                     tst.w    d0
  5412.                     @ifeq    {
  5413.                         move.w    d0,(SCSI_CylinderSize)
  5414.                     }
  5415.                 }
  5416.             }
  5417.  
  5418.             * ブートセクタよりフォーマットを判別
  5419.             move.w    (SDDMode),d0
  5420.             beq    ?_GetFormat_Normal
  5421.             cmpi.w    #1,d0
  5422.             beq    ?_GetFormat_Special
  5423.             bra    ?_UnreadyMedia
  5424.  
  5425.           ?_GetFormat_Special::
  5426.             * モードセレクト
  5427.             @do {
  5428.                 moveq.l    #$10,d2
  5429.                 moveq.l    #$0c,d3
  5430.                 lea    [ $00,$00,$00,$08,$83,$00,$00,$00,$00,$00,$08,$00 ],a1
  5431.                 SCSI    _S_MODESELECT
  5432.                 tst.l    d0
  5433.                 @break.eq;
  5434.                 cmpi.l    #SCSI_BUSYCODE,d0
  5435.                 @continue.eq;
  5436.                 cmpi.l    #SCSI_REQCODE,d0
  5437.                 @break.ne;
  5438.                 bsr    SCSI_S_REQUEST
  5439.                 cmpi.w    #6,d0
  5440.                 @continue.eq;
  5441.                 @break;
  5442.             } @while.t;
  5443.             @if [ tst.l d0 ].ne @and
  5444.                 [ cmpi.b #$05,(2+SCSI_REQUESTBuf) ].ne {
  5445.                 @do {
  5446.                     moveq.l    #$10,d2
  5447.                     moveq.l    #$0c,d3
  5448.                     lea    [ $00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$08,$00 ],a1
  5449.                     SCSI    _S_MODESELECT
  5450.                     tst.l    d0
  5451.                     @break.eq;
  5452.                     cmpi.l    #SCSI_BUSYCODE,d0
  5453.                     @continue.eq;
  5454.                     cmpi.l    #SCSI_REQCODE,d0
  5455.                     @break.ne;
  5456.                     bsr    SCSI_S_REQUEST
  5457.                     cmpi.w    #6,d0
  5458.                     @continue.eq;
  5459.                     @break;
  5460.                 } @while.t;
  5461.             }
  5462.  
  5463.             move.l    #$80,(DivideAccessSize)
  5464.             lea    CDROMHeadSecReadBuf,a1
  5465.             clr.b    (a1)
  5466.             move.l    #-1,(CDROM_DataAddress)
  5467.             bsr    FindDataTOC
  5468.             tst.l    d0
  5469.             bpl    ?_GetFormat_Special_TrackLoop
  5470.  
  5471.             move.b    (SCSI_Version),d0
  5472.             andi.b    #$07,d0
  5473.             cmpi.b    #2,d0
  5474.             bcs    ?_GetFormat_Special_TrackLoop
  5475.             bra    ?_GetFormat_Special_GetAudio
  5476.  
  5477.           ?_GetFormat_Special_TrackLoop::
  5478.             lea    CDROMHeadSecReadBuf,a1
  5479.             moveq.l    #16,d2
  5480.             add.l    (FindDataTOC_DataAddress),d2
  5481.             moveq.l    #1,d3
  5482.             moveq.l    #0,d5
  5483.             move.b    (SCSI_BlockCapacity),d5
  5484.             clr.b    (SCSI_RWEXTCmdFlag)
  5485.  .if 1    * TestRWEXTが1のときだけRWEXTをチェックする
  5486.             tst.b    (SCSI_TestRWEXTFlag)
  5487.             @ifst    {
  5488.                 SCSI    _S_READEXT
  5489.                 tst.l    d0
  5490.                 @ifeq    {
  5491.                     move.l    #$ffff,(DivideAccessSize)
  5492.                     st.b    (SCSI_RWEXTCmdFlag)
  5493.                 } @else {
  5494.                     SCSI    _S_READ
  5495.                 }
  5496.             } @else {
  5497.                 SCSI    _S_READ
  5498.             }
  5499.  .else    * 常にチェックする
  5500.             SCSI    _S_READEXT
  5501.             tst.l    d0
  5502.             @ifeq    {
  5503.                 move.l    #$ffff,(DivideAccessSize)
  5504.                 st.b    (SCSI_RWEXTCmdFlag)
  5505.             } @else {
  5506.                 SCSI    _S_READ
  5507.             }
  5508.  .endif
  5509.             tst.l    d0
  5510.             @ifeq    {
  5511.                 * ISO9660
  5512.                 cmpi.b    #$01,0(a1)
  5513.                 bne    >
  5514.                 cmpi.b    #'C',1(a1)
  5515.                 bne    >
  5516.                 cmpi.l    #'D001',2(a1)
  5517.                 beq    ?_CDROM_ISO9660_OK
  5518.                 cmpi.l    #'DROM',2(a1)
  5519.                 beq    ?_CDROM_ISO9660_OK
  5520.                 bra    >
  5521.               ?_CDROM_ISO9660_OK:
  5522.                 move.w    #SDD_FormatType_ISO9660,(FormatType)
  5523.                 move.l    (FindDataTOC_DataAddress),(CDROM_DataAddress)
  5524.                 move.w    $82(a1),(CDROM_SectorSize)
  5525.             }
  5526.  
  5527.           ?_GetFormat_Special_Next::
  5528.             bsr    FindDataTOCNext
  5529.             tst.l    d0
  5530.             bpl    ?_GetFormat_Special_TrackLoop
  5531.             tst.l    (CDROM_DataAddress)
  5532.             bpl    ?_GetFormat_CDROM
  5533.  
  5534.           ?_GetFormat_Special_GetAudio::
  5535.             move.w    #SDD_FormatType_ERROR2,(FormatType)
  5536.             bsr    FindDataTOC
  5537.             cmpi.l    #-1,d0
  5538.             @ifeq    {
  5539.                 move.w    #SDD_FormatType_Audio,(FormatType)
  5540.             }
  5541.             bra    ?_Unready
  5542.  
  5543.           ?_GetFormat_CDROM::
  5544.             lea    CDROMHeadSecReadBuf,a1
  5545.             moveq.l    #16,d2
  5546.             add.l    (CDROM_DataAddress),d2
  5547.             moveq.l    #1,d3
  5548.             moveq.l    #0,d5
  5549.             move.b    (SCSI_BlockCapacity),d5
  5550.             clr.b    (SCSI_RWEXTCmdFlag)
  5551.  .if 1    * TestRWEXTが1のときだけRWEXTをチェックする
  5552.             tst.b    (SCSI_TestRWEXTFlag)
  5553.             @ifst    {
  5554.                 SCSI    _S_READEXT
  5555.                 tst.l    d0
  5556.                 @ifeq    {
  5557.                     move.l    #$ffff,(DivideAccessSize)
  5558.                     st.b    (SCSI_RWEXTCmdFlag)
  5559.                 } @else {
  5560.                     SCSI    _S_READ
  5561.                 }
  5562.             } @else {
  5563.                 SCSI    _S_READ
  5564.             }
  5565.  .else    * 常にチェックする
  5566.             SCSI    _S_READEXT
  5567.             tst.l    d0
  5568.             @ifeq    {
  5569.                 move.l    #$ffff,(DivideAccessSize)
  5570.                 st.b    (SCSI_RWEXTCmdFlag)
  5571.             } @else {
  5572.                 SCSI    _S_READ
  5573.             }
  5574.  .endif
  5575.             bsr    InitDPB
  5576.  
  5577.             move.b    #1,(DPBCount)
  5578.  
  5579.             * 仮想ボリュームインデックスを作る
  5580.             clr.b    (VolumeEIS9)
  5581.             move.w    (FormatType),d0
  5582.             @switch [ d0 ].w {
  5583.               @case #SDD_FormatType_ISO9660:
  5584.                 movem.l    a0/a1/a2,-(sp)
  5585.                 lea    EIS9_Name+VolumeEIS9,a0
  5586.                 lea    $28(a1),a2
  5587.                 moveq.l    #0,d1
  5588.                 @do {
  5589.                     move.b    (a2)+,d0
  5590.                     cmpi.b    #' '+1,d0
  5591.                     @break.cs;
  5592.                     move.b    d0,(a0)+
  5593.                     addq.b    #1,d1
  5594.                 } @while [ cmpi.b #18,d1 ].cs;
  5595.                 clr.b    (a0)
  5596.                 lea    VolumeEIS9,a0
  5597.                 move.b    d1,EIS9_NameSize(a0)
  5598.                 addi.b    #$21,d1
  5599.                 move.b    d1,EIS9_EntrySize(a0)
  5600.  
  5601.                 lea    $32d(a1),a2
  5602.                 moveq.l    #0,d0
  5603.                 moveq.l    #0,d1
  5604.                 move.b    (a2)+,d0
  5605.                 subi.b    #'0',d0
  5606.                 add.l    d0,d1
  5607.                 mulu    #10,d1
  5608.                 move.b    (a2)+,d0
  5609.                 subi.b    #'0',d0
  5610.                 add.l    d0,d1
  5611.                 mulu    #10,d1
  5612.                 move.b    (a2)+,d0
  5613.                 subi.b    #'0',d0
  5614.                 add.l    d0,d1
  5615.                 mulu    #10,d1
  5616.                 move.b    (a2)+,d0
  5617.                 subi.b    #'0',d0
  5618.                 add.l    d0,d1
  5619.                 subi.w    #1900,d1
  5620.                 move.b    d1,EIS9_Year(a0)
  5621.                 moveq.l    #0,d1
  5622.                 move.b    (a2)+,d0
  5623.                 subi.b    #'0',d0
  5624.                 add.l    d0,d1
  5625.                 mulu    #10,d1
  5626.                 move.b    (a2)+,d0
  5627.                 subi.b    #'0',d0
  5628.                 add.l    d0,d1
  5629.                 move.b    d1,EIS9_Month(a0)
  5630.                 moveq.l    #0,d1
  5631.                 move.b    (a2)+,d0
  5632.                 subi.b    #'0',d0
  5633.                 add.l    d0,d1
  5634.                 mulu    #10,d1
  5635.                 move.b    (a2)+,d0
  5636.                 subi.b    #'0',d0
  5637.                 add.l    d0,d1
  5638.                 move.b    d1,EIS9_Day(a0)
  5639.  
  5640.                 moveq.l    #0,d1
  5641.                 move.b    (a2)+,d0
  5642.                 subi.b    #'0',d0
  5643.                 add.l    d0,d1
  5644.                 mulu    #10,d1
  5645.                 move.b    (a2)+,d0
  5646.                 subi.b    #'0',d0
  5647.                 add.l    d0,d1
  5648.                 move.b    d1,EIS9_Hour(a0)
  5649.                 moveq.l    #0,d1
  5650.                 move.b    (a2)+,d0
  5651.                 subi.b    #'0',d0
  5652.                 add.l    d0,d1
  5653.                 mulu    #10,d1
  5654.                 move.b    (a2)+,d0
  5655.                 subi.b    #'0',d0
  5656.                 add.l    d0,d1
  5657.                 move.b    d1,EIS9_Min(a0)
  5658.                 moveq.l    #0,d1
  5659.                 move.b    (a2)+,d0
  5660.                 subi.b    #'0',d0
  5661.                 add.l    d0,d1
  5662.                 mulu    #10,d1
  5663.                 move.b    (a2)+,d0
  5664.                 subi.b    #'0',d0
  5665.                 add.l    d0,d1
  5666.                 lsr.l    #1,d1
  5667.                 move.b    d1,EIS9_Sec(a0)
  5668.  
  5669.                 movem.l    (sp)+,a0/a1/a2
  5670.                 @break;
  5671.             }
  5672.  
  5673.             clr.b    (ReqRemakeDPB)
  5674.             clr.b    (ReqAskSCSIConnect)
  5675.             clr.b    (RealEjectedFlag)
  5676.             moveq.l    #0,d0
  5677.             bra    ?_Quit
  5678.  
  5679.           ?_GetFormat_Normal::
  5680.             move.l    #$80,(DivideAccessSize)
  5681.             lea    BootSecReadBuf,a1
  5682.             moveq.l    #0,d2
  5683.             moveq.l    #1,d3
  5684.             moveq.l    #0,d5
  5685.             move.b    (SCSI_BlockCapacity),d5
  5686.             clr.b    (SCSI_RWEXTCmdFlag)
  5687.  .if 1    * TestRWEXTが1のときだけRWEXTをチェックする
  5688.             tst.b    (SCSI_TestRWEXTFlag)
  5689.             @ifst    {
  5690.                 SCSI    _S_READEXT
  5691.                 tst.l    d0
  5692.                 @ifeq    {
  5693.                     move.l    #$ffff,(DivideAccessSize)
  5694.                     st.b    (SCSI_RWEXTCmdFlag)
  5695.                 } @else {
  5696.                     SCSI    _S_READ
  5697.                 }
  5698.             } @else {
  5699.                 SCSI    _S_READ
  5700.             }
  5701.  .else    * 常にチェックする
  5702.             SCSI    _S_READEXT
  5703.             tst.l    d0
  5704.             @ifeq    {
  5705.                 move.l    #$ffff,(DivideAccessSize)
  5706.                 st.b    (SCSI_RWEXTCmdFlag)
  5707.             } @else {
  5708.                 SCSI    _S_READ
  5709.             }
  5710.  .endif
  5711.             tst.l    d0
  5712.             bne    ?_UnreadyMedia
  5713.  
  5714.             clr.b    (ReqRemakeDPB)
  5715.             clr.b    (ReqAskSCSIConnect)
  5716.             clr.b    (RealEjectedFlag)
  5717.             {
  5718.                 * X68000
  5719.                 move.w    #SDD_FormatType_X68000,(FormatType)
  5720.                 cmpi.l    #'X68S',0(a1)
  5721.                 bne    @f
  5722.                 cmpi.l    #'CSI1',4(a1)
  5723.                 beq    >
  5724.               @@:
  5725.                 * PC98
  5726.                 move.w    #SDD_FormatType_PC9801,(FormatType)
  5727.                 cmpi.l    #'IPL1',4(a1)
  5728.                 beq    >
  5729.               @@:
  5730.                 * TOWNS
  5731.                 move.w    #SDD_FormatType_FMTOWNS,(FormatType)
  5732.                 cmpi.l    #'IPL4',0(a1)
  5733.                 beq    >
  5734.               @@:
  5735.                 * ZIP                    ** TNB
  5736.                                     *(ここは単純に書き間違いを直しただけ)
  5737.                 move.w    #SDD_FormatType_ZIP,(FormatType)
  5738.                 cmpi.l    #'IPAR',2(a1)
  5739.                 beq    >
  5740.               @@:
  5741.                 * IBM FDISK
  5742.                 move.w    #SDD_FormatType_IBMFDISK,(FormatType)
  5743.                 cmpi.w    #$55aa,$1fe(a1)
  5744.                 bne    @f
  5745.                 cmpi.b    #$b8,0(a1)    * Adaptec純正
  5746.                 beq    >
  5747.                 cmpi.b    #$fa,0(a1)    * Tsuru-Zoh
  5748.                 beq    >
  5749.                 cmpi.b    #$00,0(a1)    * REXFMT.EXE
  5750.                 beq    >
  5751.               @@:
  5752.                 * IBM Standard-MO
  5753.                 move.w    #SDD_FormatType_IBMMO,(FormatType)
  5754.                 cmpi.w    #$55aa,$1fe(a1)
  5755.                 bne    @f
  5756.                 cmpi.b    #$eb,0(a1)    * Adaptec純正
  5757.                 beq    >
  5758.               @@:
  5759.  
  5760.  
  5761.                                     *---------- TNB
  5762.                         * 1024b/s で 'FAT'の文字があったら・・
  5763.                         * で判断してしまってます。先に他のフォー
  5764.                         * マットチェックがあるので、大丈夫とは思
  5765.                         * うんですが。。
  5766.                 * 2HD
  5767.                 move.w    #SDD_FormatType_2HD,(FormatType)
  5768.                 move.b    (SCSI_BlockCapacity),d0
  5769.                 cmpi.b    #2,d0            * 1024b/s か?
  5770.                 bne    @f
  5771.                 cmpi.w    #'FA',$36(a1)
  5772.                 bne    @f
  5773.                 cmpi.b    #'T',$38(a1)
  5774.                 beq    >
  5775.               @@:
  5776.                         * 下のは 68 の FORMAT で 2HD(144)等を
  5777.                         * 作った時、IPL に 68 のが書かれてし
  5778.                         * まうので、こういう判断にしました
  5779.                 * IBM Standard (別タイプ[68のフォーマッタなど])
  5780.                 move.w    #SDD_FormatType_IBMMO,(FormatType)
  5781.                 cmpi.w    #'FA',$36(a1)
  5782.                 bne    @f
  5783.                 cmpi.b    #'T',$38(a1)
  5784.                 bne    @f
  5785.                 tst.w    $1fe(a1)
  5786.                 bne    @f
  5787.                 cmpi.b    #$eb,0(a1)    * Adaptec純正
  5788.                 beq    >
  5789.                 cmpi.b    #$60,0(a1)    * X68
  5790.                 beq    >
  5791.               @@:
  5792.                                     *---------- TNB
  5793.  
  5794.  
  5795.                 move.w    #SDD_FormatType_ERROR2,(FormatType)
  5796.                 bra    ?_Unready
  5797.             }
  5798.  
  5799.             * IOCS _S_VERIFYが使用できるかどうか調べる
  5800.             clr.b    (SCSI_VerifyCmdFlag)
  5801.             move.b    (SCSI_VERIFYMode),d0
  5802.             @switch [ d0 ].b {
  5803.               @case    #1:
  5804.                 lea    BootSecReadBuf,a1
  5805.                 moveq.l    #0,d2
  5806.                 moveq.l    #1,d3
  5807.                 moveq.l    #0,d5
  5808.                 move.b    (SCSI_BlockCapacity),d5
  5809.                 SCSI    _S_VERIFY
  5810.                 tst.l    d0
  5811.                 @ifeq    {
  5812.                     st.b    (SCSI_VerifyCmdFlag)
  5813.                 } @else {
  5814.                     SCSI    _S_TESTUNIT    * エラーステータスを消すためダミー発行
  5815.                     SCSI    _S_TESTUNIT    * エラーステータスを消すためダミー発行
  5816.                 }
  5817.                 @break;
  5818.               @case    #2:
  5819.                 st.b    (SCSI_VerifyCmdFlag)
  5820.                 @break;
  5821.             }
  5822.  
  5823.             move.w    (FormatType),d0
  5824.             bmi    ?_Unready
  5825.             cmpi.w    #SDD_FormatType_End1,d0
  5826.             bhi    ?_Unready
  5827.             add.w    d0,d0
  5828.             lea    ?_GetPartSec_JpTable(pc),a1
  5829.             move.w    (a1,d0.w),d0
  5830.             jsr    (a1,d0.w)
  5831.             tst.l    d0
  5832.             bmi    ?_Unready
  5833.  
  5834.             bsr    InitDPB
  5835.  
  5836.             * パーティション作成
  5837.             lea    PartitionSecReadBuf,a2
  5838.             lea    DPBTable,a3
  5839.             lea    DPBBuf,a4
  5840.             @repeat [ d7, #MAXDPB-1 ].q {
  5841.                 move.w    (FormatType),d0
  5842.                 @continue.mi;
  5843.                 add.w    d0,d0
  5844.                 lea    ?_GetIPLSec_JpTable(pc),a1
  5845.                 move.w    (a1,d0.w),d0
  5846.                 jsr    (a1,d0.w)
  5847.                 tst.l    d0
  5848.                 @continue.ne;
  5849.  
  5850.                 * DPB情報作成その4(デバイスドライバ関連)
  5851.                 move.b    (DPBCount),d0
  5852.                 move.b    d0,XDPB_UnitNo(a4)
  5853.  
  5854.                 * Next
  5855.                 addq.b    #1,(DPBCount)
  5856.                 lea    SizeOf1DPBTable(a3),a3
  5857.                 lea    SizeOfXDPB(a4),a4
  5858.             }
  5859.  
  5860.  .if 0
  5861.             clr.b    (ReqRemakeDPB)
  5862.             clr.b    (ReqAskSCSIConnect)
  5863.             clr.b    (RealEjectedFlag)
  5864.  .endif
  5865.             moveq.l    #0,d0
  5866.             bra    ?_Quit
  5867.  
  5868.           ?_UnreadyMedia::
  5869.             tst.b    (SCSI_WaitBusyFlag)
  5870.             @ifst    {
  5871.                 cmpi.l    #SCSI_BUSYCODE,d0
  5872.                 @ifeq    {
  5873.                     bsr    WaitSec
  5874.                     bra    ?_Retrylp
  5875.                 }
  5876.             }
  5877.             addq.b    #1,(RemakeDPBRetryFlag)
  5878.             cmpi.b    #RETRYCOUNT,(RemakeDPBRetryFlag)
  5879.             bcs    ?_Retrylp
  5880.           ?_Unready::
  5881.             st.b    (RealEjectedFlag)
  5882.             moveq.l    #-1,d0
  5883.             bra    ?_Quit
  5884.  
  5885.           ?_ForceEject::
  5886.             st.b    (RealEjectedFlag)
  5887.             clr.b    (DPBCount)
  5888.             moveq.l    #-1,d0
  5889.             bra    ?_Quit
  5890.  
  5891.           ?_Quit::
  5892.             tst.b    (DPBCount)
  5893.             @ifeq    {
  5894.                 tst.w    (FormatType)
  5895.                 @ifpl    {
  5896.                     move.w    #SDD_FormatType_ERROR2,(FormatType)
  5897.                 }
  5898.                 addq.b    #1,(DPBCount)
  5899.             }
  5900.             movem.l    (sp)+,d1-d7/a0-a6
  5901.             rts
  5902.  
  5903.             * パーティションセクタを取得
  5904.           ?_GetPartSec_JpTable::
  5905.             dc.w    ?_GetPartSec_X68-?_GetPartSec_JpTable
  5906.             dc.w    ?_GetPartSec_PC98-?_GetPartSec_JpTable
  5907.             dc.w    ?_GetPartSec_TOWNS-?_GetPartSec_JpTable
  5908.             dc.w    ?_GetPartSec_IBM-?_GetPartSec_JpTable
  5909.             dc.w    ?_GetPartSec_IBMFDISK-?_GetPartSec_JpTable
  5910.             dc.w    ?_GetPartSec_ZIP-?_GetPartSec_JpTable
  5911.                                     *---------- TNB
  5912.                                 * 新しい TYPE を作りました ^^;
  5913.             dc.w    ?_GetPartSec_2HD-?_GetPartSec_JpTable
  5914.                                     *---------- TNB
  5915.  
  5916.           ?_GetPartSec_Unready::
  5917.             moveq.l    #-1,d0
  5918.             rts
  5919.  
  5920.           ?_GetPartSec_X68::
  5921.             lea    PartitionSecReadBuf,a1
  5922.             moveq.l    #8,d2
  5923.             move.b    (SCSI_BlockCapacity),d0
  5924.             lsr.l    d0,d2
  5925.             moveq.l    #1,d3
  5926.             moveq.l    #0,d5
  5927.             move.b    (SCSI_BlockCapacity),d5
  5928.             bsr    SCSI_S_READ
  5929.             tst.l    d0
  5930.             bne    ?_GetPartSec_Unready
  5931.             lea    PartitionSecReadBuf,a2
  5932.             cmpi.l    #'X68K',0(a2)
  5933.             bne    ?_GetPartSec_Unready
  5934.             moveq.l    #0,d0
  5935.             rts
  5936.  
  5937.           ?_GetPartSec_PC98::
  5938.             clr.l    (PC98GetIPLRetryCount)
  5939.             lea    PartitionSecReadBuf,a1
  5940.             moveq.l    #1,d2
  5941.             moveq.l    #1,d3
  5942.             moveq.l    #0,d5
  5943.             move.b    (SCSI_BlockCapacity),d5
  5944.             bsr    SCSI_S_READ
  5945.             tst.l    d0
  5946.             bne    ?_GetPartSec_Unready
  5947.             moveq.l    #0,d0
  5948.             rts
  5949.  
  5950.           ?_GetPartSec_TOWNS::
  5951.             lea    PartitionSecReadBuf,a1
  5952.             moveq.l    #1,d2
  5953.             moveq.l    #1,d3
  5954.             moveq.l    #0,d5
  5955.             move.b    (SCSI_BlockCapacity),d5
  5956.             bsr    SCSI_S_READ
  5957.             tst.l    d0
  5958.             bne    ?_GetPartSec_Unready
  5959.             lea    PartitionSecReadBuf,a2
  5960.             cmpi.l    #'富士',0(a2)
  5961.             bne    ?_GetPartSec_Unready
  5962.             cmpi.w    #'通',4(a2)
  5963.             bne    ?_GetPartSec_Unready
  5964.             moveq.l    #0,d0
  5965.             rts
  5966.  
  5967.           ?_GetPartSec_IBM::
  5968.             moveq.l    #0,d0
  5969.             rts
  5970.  
  5971.           ?_GetPartSec_IBMFDISK::
  5972.             clr.l    (IBMFDISKPartSec)
  5973.             clr.l    (IBMFDISKExPartFlag)
  5974.             lea    PartitionSecReadBuf,a1
  5975.             move.l    (IBMFDISKPartSec),d2
  5976.             moveq.l    #1,d3
  5977.             moveq.l    #0,d5
  5978.             move.b    (SCSI_BlockCapacity),d5
  5979.             @ifeq    {
  5980.                 add.l    d3,d3
  5981.             }
  5982.             bsr    SCSI_S_READ
  5983.             tst.l    d0
  5984.             bne    ?_GetPartSec_Unready
  5985.             moveq.l    #0,d0
  5986.             rts
  5987.  
  5988.           ?_GetPartSec_ZIP::
  5989.             lea    PartitionSecReadBuf,a1
  5990.             moveq.l    #0,d2
  5991.             moveq.l    #1,d3
  5992.             moveq.l    #0,d5
  5993.             move.b    (SCSI_BlockCapacity),d5
  5994.             bsr    SCSI_S_READ
  5995.             tst.l    d0
  5996.             bne    ?_GetPartSec_Unready
  5997.             lea    PartitionSecReadBuf,a2
  5998.             cmpi.l    #'IPAR',2(a2)
  5999.             bne    ?_GetPartSec_Unready
  6000.             moveq.l    #0,d0
  6001.             rts
  6002.  
  6003.                                     *---------- TNB
  6004.           ?_GetPartSec_2HD::
  6005.             moveq.l    #0,d0
  6006.             rts
  6007.                                     *---------- TNB
  6008.  
  6009.             * IPLセクタを取得
  6010.           ?_GetIPLSec_JpTable::
  6011.             dc.w    ?_GetIPLSec_X68-?_GetIPLSec_JpTable
  6012.             dc.w    ?_GetIPLSec_PC98-?_GetIPLSec_JpTable
  6013.             dc.w    ?_GetIPLSec_TOWNS-?_GetIPLSec_JpTable
  6014.             dc.w    ?_GetIPLSec_IBM-?_GetIPLSec_JpTable
  6015.             dc.w    ?_GetIPLSec_IBMFDISK-?_GetIPLSec_JpTable
  6016.             dc.w    ?_GetIPLSec_ZIP-?_GetIPLSec_JpTable
  6017.                                     *---------- TNB
  6018.             dc.w    ?_GetIPLSec_2HD-?_GetIPLSec_JpTable
  6019.                                     *---------- TNB
  6020.  
  6021.           ?_GetIPLSec_Unready::
  6022.             moveq.l    #-1,d0
  6023.             rts
  6024.  
  6025.           ?_GetIPLSec_Sub2::
  6026.             move.w    XDPB_SecByte(a4),d0
  6027.             moveq.l    #-1,d1
  6028.             @do {
  6029.                 addq.b    #1,d1
  6030.                 lsr.w    #1,d0
  6031.             } @while.cc;
  6032.             move.b    d1,XDPB_SftSecByte(a4)
  6033.  
  6034.             moveq.l    #0,d1
  6035.             move.b    XDPB_FATNum(a4),d1
  6036.             moveq.l    #0,d2
  6037.             move.b    XDPB_FATSize(a4),d2
  6038.             mulu    d2,d1
  6039.             add.w    XDPB_FATSec(a4),d1
  6040.             move.w    d1,XDPB_RootSec(a4)
  6041.  
  6042.             move.w    XDPB_RootEntryNum(a4),d0
  6043.             mulu    #32,d0
  6044.             divu    XDPB_SecByte(a4),d0
  6045.             move.w    XDPB_RootSec(a4),d1
  6046.             add.w    d0,d1
  6047.             move.w    d1,XDPB_DataSec(a4)
  6048.  
  6049.             move.b    XDPB_CluSec(a4),d0
  6050.             addq.b    #1,d0
  6051.             moveq.l    #-1,d1
  6052.             @do {
  6053.                 addq.b    #1,d1
  6054.                 lsr.b    #1,d0
  6055.             } @while.cc;
  6056.             move.b    d1,XDPB_SftCluSec(a4)
  6057.  
  6058.             move.l    a4,DPBTable_XDPBPtr(a3)
  6059.             move.w    XDPB_SecByte(a4),d0
  6060.             move.w    (SCSI_BlockCapacityByte),d1
  6061.             moveq.l    #0,d2
  6062.             @while [ cmp.w d0,d1 ].ne {
  6063.                 addq.w    #1,d2
  6064.                 lsr.w    #1,d0
  6065.             }
  6066.             move.w    d2,DPBTable_Sft(a3)
  6067.  
  6068.             rts
  6069.  
  6070.  
  6071.           ?_GetIPLSec_X68::
  6072.             * Human68kパーティションであることを確認
  6073.             lea    16(a2),a2
  6074.             cmpi.l    #'Huma',0(a2)
  6075.             bne    ?_GetIPLSec_Unready
  6076.             cmpi.l    #'n68k',4(a2)
  6077.             bne    ?_GetIPLSec_Unready
  6078.  
  6079.             * Activeチェック
  6080.             move.b    8(a2),d0
  6081.             btst    #0,d0
  6082.             bst    ?_GetIPLSec_Unready
  6083.  
  6084.             * IPLセクタを読み込む
  6085.             lea    IPLSecReadBuf,a1
  6086.             move.l    8(a2),d2
  6087.             andi.l    #$ffffff,d2
  6088.             move.b    (SCSI_BlockCapacity),d0
  6089.             lsl.l    #2,d2
  6090.             lsr.l    d0,d2
  6091.             move.l    d2,DPBTable_BaseSec(a3)
  6092.             moveq.l    #1,d3
  6093.             moveq.l    #0,d5
  6094.             move.b    (SCSI_BlockCapacity),d5
  6095.             bsr    SCSI_S_READ
  6096.             tst.l    d0
  6097.             bne    ?_GetIPLSec_Unready
  6098.  
  6099.             * DPB情報作成その1(XIPLからコピー)
  6100.             move.w    XIPL_SecByte(a1),d0
  6101.             beq    ?_GetIPLSec_Unready
  6102.             tst.b    d0
  6103.             bne    ?_GetIPLSec_Unready
  6104.             cmp.w    (HUWK_BuffersSize),d0
  6105.             bhi    ?_GetIPLSec_Unready
  6106.             move.w    d0,XDPB_SecByte(a4)
  6107.             move.w    XIPL_FATSec(a1),XDPB_FATSec(a4)
  6108.             move.b    XIPL_FATNum(a1),XDPB_FATNum(a4)
  6109.             beq    ?_GetIPLSec_Unready
  6110.             move.w    XIPL_RootEntryNum(a1),XDPB_RootEntryNum(a4)
  6111.             beq    ?_GetIPLSec_Unready
  6112.             move.b    XIPL_MediaID(a1),XDPB_MediaID(a4)
  6113.             move.b    XIPL_FATSize(a1),XDPB_FATSize(a4)
  6114.             beq    ?_GetIPLSec_Unready
  6115.             move.b    XIPL_CluSec(a1),d0
  6116.             subq.b    #1,d0
  6117.             move.b    d0,XDPB_CluSec(a4)
  6118.             tst.b    (SCSI_RemovableFlag)
  6119.             @ifst    {
  6120.                 move.b    #$f6,XDPB_MediaID(a4)
  6121.             } @else {
  6122.                 move.b    #$f7,XDPB_MediaID(a4)
  6123.             }
  6124.  
  6125.             * DPB情報作成その2(XDPBから計算が必要なもの)
  6126.             bsr    ?_GetIPLSec_Sub2
  6127.  
  6128.             * DPB情報作成その3(XIPLから計算が必要なもの)
  6129.             moveq.l    #0,d0
  6130.             move.w    XIPL_MaxSecW(a1),d0
  6131.             @ifeq    {
  6132.                 move.l    XIPL_MaxSecL(a1),d0
  6133.             }
  6134.             moveq.l    #0,d1
  6135.             move.w    XDPB_DataSec(a4),d1
  6136.             sub.l    d1,d0
  6137.             move.b    XDPB_SftCluSec(a4),d1
  6138.             andi.b    #$7f,d1
  6139.             lsr.l    d1,d0
  6140.             addq.w    #3,d0
  6141.             move.w    d0,XDPB_CluNum(a4)
  6142.  
  6143.             moveq.l    #0,d0
  6144.             rts
  6145.  
  6146.           ?_GetIPLSec_MSDOS::
  6147.             * DPB情報作成その1
  6148.             move.b    $0c(a1),d0
  6149.             rol.w    #8,d0
  6150.             move.b    $0b(a1),d0
  6151.             tst.w    d0
  6152.             beq    ?_GetIPLSec_Unready
  6153.             tst.b    d0
  6154.             bne    ?_GetIPLSec_Unready
  6155.             cmp.w    (HUWK_BuffersSize),d0
  6156.             bhi    ?_GetIPLSec_Unready
  6157.             move.w    d0,XDPB_SecByte(a4)
  6158.             move.b    $0f(a1),d0
  6159.             rol.w    #8,d0
  6160.             move.b    $0e(a1),d0
  6161.             move.w    d0,XDPB_FATSec(a4)
  6162.             move.b    $10(a1),XDPB_FATNum(a4)
  6163.             beq    ?_GetIPLSec_Unready
  6164.             move.b    $12(a1),d0
  6165.             rol.w    #8,d0
  6166.             move.b    $11(a1),d0
  6167.             move.w    d0,XDPB_RootEntryNum(a4)
  6168.             beq    ?_GetIPLSec_Unready
  6169.             move.b    $15(a1),XDPB_MediaID(a4)
  6170.             move.b    $16(a1),XDPB_FATSize(a4)
  6171.             beq    ?_GetIPLSec_Unready
  6172.             move.b    $0d(a1),d0
  6173.             subq.b    #1,d0
  6174.             move.b    d0,XDPB_CluSec(a4)
  6175.             tst.b    (SCSI_RemovableFlag)
  6176.             @ifst    {
  6177.                 move.b    #$f6,XDPB_MediaID(a4)
  6178.             } @else {
  6179.                 move.b    #$f7,XDPB_MediaID(a4)
  6180.             }
  6181.  
  6182.             * DPB情報作成その2(XDPBから計算が必要なもの)
  6183.             bsr    ?_GetIPLSec_Sub2
  6184.             ori.b    #$80,XDPB_SftCluSec(a4)    * インテルFAT指定
  6185.  
  6186.             * DPB情報作成その3(XIPLから計算が必要なもの)
  6187.             moveq.l    #0,d0
  6188.             move.b    $14(a1),d0
  6189.             rol.w    #8,d0
  6190.             move.b    $13(a1),d0
  6191.             tst.w    d0
  6192.             @ifeq    {
  6193.                 move.b    $23(a1),d0
  6194.                 rol.l    #8,d0
  6195.                 move.b    $22(a1),d0
  6196.                 rol.l    #8,d0
  6197.                 move.b    $21(a1),d0
  6198.                 rol.l    #8,d0
  6199.                 move.b    $20(a1),d0
  6200.             }
  6201.             moveq.l    #0,d1
  6202.             move.w    XDPB_DataSec(a4),d1
  6203.             sub.l    d1,d0
  6204.             move.b    XDPB_SftCluSec(a4),d1
  6205.             andi.b    #$7f,d1
  6206.             lsr.l    d1,d0
  6207.             addq.w    #3,d0
  6208.             move.w    d0,XDPB_CluNum(a4)
  6209.  
  6210.             moveq.l    #0,d0
  6211.             rts
  6212.  
  6213.           ?_GetIPLSec_PC98::
  6214.             * MS-DOSパーティションであることを確認
  6215.             lea    32(a2),a2
  6216.  .if 0
  6217.             cmpi.l    #'MS-D',-32+$10(a2)
  6218.             bne    ?_GetIPLSec_Unready
  6219.             cmpi.w    #'OS',-32+$14(a2)
  6220.             bne    ?_GetIPLSec_Unready
  6221.  .endif
  6222.             move.b    -32+$00(a2),d0
  6223.             btst    #5,d0
  6224.             bcl    ?_GetIPLSec_Unready
  6225.  
  6226.             * Activeチェック
  6227.             move.b    -32+$01(a2),d0
  6228.             btst    #7,d0
  6229.             bcl    ?_GetIPLSec_Unready
  6230.  
  6231.             * IPLセクタを読み込む
  6232.           ?_GetIPLSec_PC98_Retry::
  6233.             move.l    (PC98GetIPLRetryCount),d0
  6234.             @switch [ d0 ].b {
  6235.               @case    #0:
  6236.                 moveq.l    #0,d0
  6237.                 move.w    (SCSI_CylinderSize),d0
  6238.                 @break;
  6239.               @case    #1:
  6240.                 moveq.l    #0,d0
  6241.                 move.w    (SCSI_CylinderSize2),d0
  6242.                 @break;
  6243.               @case    #2:
  6244.                 move.l    (SpOption_98C),d0
  6245.                 @break;
  6246.               @case    #3:
  6247.                 bsr    ?_SearchPC98IPL
  6248.                 @break;
  6249.               @case    #4:
  6250.                 bra    ?_GetIPLSec_Unready
  6251.             }
  6252.             tst.l    d0
  6253.             @ifeq    {
  6254.                 addq.l    #1,(PC98GetIPLRetryCount)
  6255.                 bra    ?_GetIPLSec_PC98_Retry
  6256.             }
  6257.             lea    IPLSecReadBuf,a1
  6258.             move.b    -32+$0b(a2),d2
  6259.             rol.w    #8,d2
  6260.             move.b    -32+$0a(a2),d2
  6261.             mulu    d0,d2
  6262.             move.l    d2,DPBTable_BaseSec(a3)
  6263.             moveq.l    #1,d3
  6264.             moveq.l    #0,d5
  6265.             move.b    (SCSI_BlockCapacity),d5
  6266.             bsr    SCSI_S_READ
  6267.             tst.l    d0
  6268.             bne    ?_GetIPLSec_Unready
  6269.             cmpi.b    #$eb,(a1)
  6270.             @ifne    {
  6271.                 addq.l    #1,(PC98GetIPLRetryCount)
  6272.                 bra    ?_GetIPLSec_PC98_Retry
  6273.             }
  6274.             bra    ?_GetIPLSec_MSDOS
  6275.  
  6276.           ?_GetIPLSec_TOWNS::
  6277.             * MS-DOSパーティションであることを確認
  6278.             lea    48(a2),a2
  6279.             cmpi.l    #'MS-D',-16+$10(a2)
  6280.             bne    ?_GetIPLSec_Unready
  6281.             cmpi.w    #'OS',-16+$14(a2)
  6282.             bne    ?_GetIPLSec_Unready
  6283.  
  6284.             * Activeチェック
  6285.             move.b    -16+$01(a2),d0
  6286.             bcl    ?_GetIPLSec_Unready
  6287.  
  6288.             * IPLセクタを読み込む
  6289.             lea    IPLSecReadBuf,a1
  6290.             move.b    -16+$05(a2),d2
  6291.             rol.l    #8,d2
  6292.             move.b    -16+$04(a2),d2
  6293.             rol.l    #8,d2
  6294.             move.b    -16+$03(a2),d2
  6295.             rol.l    #8,d2
  6296.             move.b    -16+$02(a2),d2
  6297.             move.l    d2,DPBTable_BaseSec(a3)
  6298.             moveq.l    #1,d3
  6299.             moveq.l    #0,d5
  6300.             move.b    (SCSI_BlockCapacity),d5
  6301.             bsr    SCSI_S_READ
  6302.             tst.l    d0
  6303.             bne    ?_GetIPLSec_Unready
  6304.             cmpi.l    #'IPL4',0(a1)
  6305.             bne    ?_GetIPLSec_Unready
  6306.             bra    ?_GetIPLSec_MSDOS
  6307.  
  6308.  
  6309.           ?_GetIPLSec_IBM::
  6310.             * IBMは1パーティションのみ
  6311.             cmpi.w    #MAXDPB-1,d7
  6312.             bne    ?_GetIPLSec_Unready
  6313.  
  6314.             * Activeチェック
  6315.  
  6316.             * IPLセクタを読み込む
  6317.             lea    IPLSecReadBuf,a1
  6318.             moveq.l    #0,d2
  6319.             move.l    d2,DPBTable_BaseSec(a3)
  6320.             moveq.l    #1,d3
  6321.             moveq.l    #0,d5
  6322.             move.b    (SCSI_BlockCapacity),d5
  6323.             bsr    SCSI_S_READ
  6324.             tst.l    d0
  6325.             bne    ?_GetIPLSec_Unready
  6326.             bsr    ?_GetIPLSec_MSDOS
  6327.                                     *---------- TNB
  6328.                                 * IBM FORMAT でも、FD の場合
  6329.                                 * やはりメディアタイプを変え
  6330.                                 * たいのでここで判断していま
  6331.                                 * す。ただ、サイズだけでチェッ
  6332.                                 * クしているのでこの大きさの
  6333.                                 * MO があったら・・・。でも
  6334.                                 * 他にいい方法が見つからな
  6335.                                 * いので、こうしてます。
  6336.                                 * _SftCluSec を andi.b して
  6337.                                 * いるのは頭 bit が立ってい
  6338.                                 * ると DISKCOPY で違うメディ
  6339.                                 * アとなりコピー出来ないから
  6340.                                 * です。デバドラ内では問題無
  6341.                                 * いでしょうか? 実際これで
  6342.                                 * 今いろいろしていますが、問
  6343.                                 * 題は出てませんが。。。
  6344.             move.l    (SCSI_TotalBlock),d0
  6345.             cmpi.l    #$0B40-1,d0
  6346.             bne    @f
  6347.             *--- 2HD
  6348.             move.b    #$FA,XDPB_MediaID(a4)
  6349.             andi.b    #$7F,XDPB_SftCluSec(a4)        * 0 にする
  6350.             moveq    #0,d0
  6351.             rts
  6352.         @@:
  6353.             cmpi.l    #$05a0-1,d0
  6354.             bne    @f
  6355.             *--- 2DD
  6356.             move.b    #$FC,XDPB_MediaID(a4)
  6357.             andi.b    #$7F,XDPB_SftCluSec(a4)        * 0 にする
  6358.         @@:
  6359.             moveq    #0,d0
  6360.             rts
  6361.                                     *---------- TNB
  6362.  
  6363.  
  6364.           ?_GetIPLSec_IBMFDISK::
  6365.             cmpi.l    #-1,(IBMFDISKPartSec)
  6366.             beq    ?_GetIPLSec_Unready
  6367.  
  6368.             * MS-DOSパーティションであることを確認
  6369.             lea    $1c2(a2),a0
  6370.             moveq.l    #0,d0
  6371.             tst.b    (IBMFDISKExPartFlag)
  6372.             @ifcl    {
  6373.                 moveq.l    #MAXDPB-1,d0
  6374.                 sub.w    d7,d0
  6375.                 mulu    #$10,d0
  6376.             }
  6377.             tst.b    (a0,d0.w)
  6378.             bmi    ?_GetIPLSec_Unready
  6379.  
  6380.             * Activeチェック
  6381.         .if 0 * 判定方法不明
  6382.             move.b    -16+$c0(a2),d0
  6383.             btst    #0,d0
  6384.             bcl    ?_GetIPLSec_Unready
  6385.         .endif
  6386.  
  6387.             * IPLセクタを読み込む
  6388.             lea    IPLSecReadBuf,a1
  6389.             lea    $1c6(a2),a0
  6390.             tst.b    (IBMFDISKExPartFlag)
  6391.             @ifcl    {
  6392.                 moveq.l    #MAXDPB-1,d0
  6393.                 sub.w    d7,d0
  6394.                 mulu    #$10,d0
  6395.             }
  6396.             move.b    3(a0,d0.w),d2
  6397.             rol.l    #8,d2
  6398.             move.b    2(a0,d0.w),d2
  6399.             rol.l    #8,d2
  6400.             move.b    1(a0,d0.w),d2
  6401.             rol.l    #8,d2
  6402.             move.b    0(a0,d0.w),d2
  6403.             add.l    (IBMFDISKPartSec),d2
  6404.             tst.l    d2
  6405.             @ifeq    {
  6406.                 move.l    #-1,(IBMFDISKPartSec)
  6407.                 bra    ?_GetIPLSec_Unready
  6408.             }
  6409.             move.l    d2,DPBTable_BaseSec(a3)
  6410.             moveq.l    #1,d3
  6411.             moveq.l    #0,d5
  6412.             move.b    (SCSI_BlockCapacity),d5
  6413.             @ifeq    {
  6414.                 add.l    d3,d3
  6415.             }
  6416.             bsr    SCSI_S_READ
  6417.             tst.l    d0
  6418.             bne    ?_GetIPLSec_Unready
  6419.  
  6420.             * パーティションがLinux形式かどうかを調べる
  6421.             cmpi.w    #MAXDPB-1,d7
  6422.             @ifeq    {
  6423.                 cmpi.b    #$05,$1d2(a2)
  6424.                 @ifeq    {
  6425.                     st.b    (IBMFDISKExPartFlag)
  6426.                 }
  6427.             }
  6428.             lea    $1c2(a2),a0
  6429.             tst.b    (IBMFDISKExPartFlag)
  6430.             @ifcl    {
  6431.                 moveq.l    #MAXDPB-1,d0
  6432.                 sub.w    d7,d0
  6433.                 mulu    #$10,d0
  6434.             }
  6435.             tst.b    (a0,d0.w)
  6436.             bmi    ?_GetIPLSec_Unready
  6437.  
  6438.             * 次のパーティションリンク情報を読む
  6439.             move.b    $1d9(a2),d0
  6440.             rol.l    #8,d0
  6441.             move.b    $1d8(a2),d0
  6442.             rol.l    #8,d0
  6443.             move.b    $1d7(a2),d0
  6444.             rol.l    #8,d0
  6445.             move.b    $1d6(a2),d0
  6446.             tst.l    d0
  6447.             @ifeq    {
  6448.                 move.l    #-1,(IBMFDISKPartSec)
  6449.             } @else {
  6450.                 lea    PartitionSecReadBuf,a1
  6451.                 move.b    $1c9(a2),d0
  6452.                 rol.l    #8,d0
  6453.                 move.b    $1c8(a2),d0
  6454.                 rol.l    #8,d0
  6455.                 move.b    $1c7(a2),d0
  6456.                 rol.l    #8,d0
  6457.                 move.b    $1c6(a2),d0
  6458.                 move.b    $1cd(a2),d2
  6459.                 rol.l    #8,d2
  6460.                 move.b    $1cc(a2),d2
  6461.                 rol.l    #8,d2
  6462.                 move.b    $1cb(a2),d2
  6463.                 rol.l    #8,d2
  6464.                 move.b    $1ca(a2),d2
  6465.                 add.l    d0,d2
  6466.                 add.l    (IBMFDISKPartSec),d2
  6467.                 move.l    d2,(IBMFDISKPartSec)
  6468.                 moveq.l    #1,d3
  6469.                 moveq.l    #0,d5
  6470.                 move.b    (SCSI_BlockCapacity),d5
  6471.                 @ifeq    {
  6472.                     add.l    d3,d3
  6473.                 }
  6474.                 bsr    SCSI_S_READ
  6475.                 tst.l    d0
  6476.                 @ifne    {
  6477.                     move.l    #-1,(IBMFDISKPartSec)
  6478.                 }
  6479.                 moveq.l    #0,d0
  6480.             }
  6481.  
  6482.             lea    IPLSecReadBuf,a1
  6483.             cmpi.b    #$eb,(a1)
  6484.             beq    ?_GetIPLSec_MSDOS
  6485.             cmpi.b    #$e9,(a1)        *-------- Mitsuky
  6486.             beq    ?_GetIPLSec_MSDOS
  6487.             bra    ?_GetIPLSec_Unready
  6488.  
  6489.           ?_SearchPC98IPL::
  6490.             movem.l    d1-d7/a0-a5,-(sp)
  6491.  
  6492.             move.l    (SoftVerifyBufSize),d0
  6493.             divu    (SCSI_BlockCapacityByte),d0
  6494.             andi.l    #$ff,d0
  6495.             move.w    d0,a5
  6496.             move.l    #$1000,d1
  6497.             divu    d0,d1
  6498.             move.w    d1,a4
  6499.  
  6500.             moveq.l    #1,d7
  6501.             @do {
  6502.                 lea    SoftVerifyBuf,a1
  6503.                 move.w    a5,d2
  6504.                 mulu    d7,d2
  6505.                 add.w    #$10,d2
  6506.                 move.w    a5,d3
  6507.                 moveq.l    #0,d5
  6508.                 move.b    (SCSI_BlockCapacity),d5
  6509.                 bsr    SCSI_S_READ
  6510.                 tst.l    d0
  6511.                 bne    ?_SearchPC98IPL_NotFound
  6512.                 moveq.l    #0,d6
  6513.                 @do {
  6514.                     cmpi.b    #$eb,(a1)
  6515.                     beq    ?_SearchPC98IPL_Found
  6516.                     adda.w    (SCSI_BlockCapacityByte),a1
  6517.                 } @while [ addq.w #1,d6; cmp.w a5,d6 ].cs;
  6518.             } @while [ addq.w #1,d7; cmp.w a4,d7 ].cs;
  6519.           ?_SearchPC98IPL_NotFound::
  6520.             moveq.l    #0,d0
  6521.             bra    ?_SearchPC98IPL_e
  6522.           ?_SearchPC98IPL_Found::
  6523.             move.w    a5,d0
  6524.             mulu    d7,d0
  6525.             add.w    #$10,d0
  6526.             add.l    d6,d0
  6527.           ?_SearchPC98IPL_e::
  6528.             movem.l    (sp)+,d1-d7/a0-a5
  6529.             rts
  6530.  
  6531.  
  6532.           ?_GetIPLSec_ZIP::
  6533.             * MS-DOSパーティションであることを確認
  6534.         .if 0 * 判定方法不明
  6535.             lea    48(a2),a2
  6536.             cmpi.l    #'MS-D',-16+$10(a2)
  6537.             bne    ?_GetIPLSec_Unready
  6538.             cmpi.w    #'OS',-16+$14(a2)
  6539.             bne    ?_GetIPLSec_Unready
  6540.         .endif
  6541.  
  6542.             * Activeチェック
  6543.         .if 0 * 判定方法不明
  6544.             move.b    -16+$01(a2),d0
  6545.             bcl    ?_GetIPLSec_Unready
  6546.         .endif
  6547.  
  6548.             * IPLセクタを読み込む
  6549.             lea    IPLSecReadBuf,a1
  6550.             move.b    $1f9(a2),d2
  6551.             rol.l    #8,d2
  6552.             move.b    $1f8(a2),d2
  6553.             rol.l    #8,d2
  6554.             move.b    $1f7(a2),d2
  6555.             rol.l    #8,d2
  6556.             move.b    $1f6(a2),d2
  6557.             move.l    d2,DPBTable_BaseSec(a3)
  6558.             moveq.l    #1,d3
  6559.             moveq.l    #0,d5
  6560.             move.b    (SCSI_BlockCapacity),d5
  6561.             bsr    SCSI_S_READ
  6562.             tst.l    d0
  6563.             bne    ?_GetIPLSec_Unready
  6564.             cmpi.b    #$eb,(a1)
  6565.             bne    ?_GetIPLSec_Unready
  6566.             bra    ?_GetIPLSec_MSDOS
  6567.  
  6568.                                     *---------- TNB
  6569.                             * 2HD の設定をしてます。
  6570.                             * やり方、あってますよね? ^^;
  6571.           ?_GetIPLSec_2HD::
  6572.             * 2HDはパーティションは無し
  6573.             cmpi.w    #MAXDPB-1,d7
  6574.             bne    ?_GetIPLSec_Unready
  6575.             * IPLセクタを読み込む
  6576.             lea    IPLSecReadBuf,a1
  6577.             moveq.l    #0,d2
  6578.             move.l    d2,DPBTable_BaseSec(a3)
  6579.             moveq.l    #1,d3
  6580.             moveq.l    #0,d5
  6581.             move.b    (SCSI_BlockCapacity),d5
  6582.             bsr    SCSI_S_READ
  6583.             tst.l    d0
  6584.             bne    ?_GetIPLSec_Unready
  6585.             bsr    ?_GetIPLSec_MSDOS
  6586.             move.b    #$FE,XDPB_MediaID(a4)
  6587.             andi.b    #$7F,XDPB_SftCluSec(a4)        * 0 にする
  6588.             moveq.l    #0,d0
  6589.             rts
  6590.                                     *---------- TNB
  6591.         }
  6592.  
  6593.  
  6594. *************************************************************************
  6595.  
  6596.  
  6597. *    void    InitDPB( void );
  6598. *
  6599. *        DPBを初期化する。
  6600. *        in    なし
  6601. *        out    なし
  6602.  
  6603.  
  6604.         @xproc    [ InitDPB ] {
  6605.             movem.l    d1-d7/a0-a6,-(sp)
  6606.  
  6607.             * DPB情報バックアップ
  6608.             lea    DPBTable,a1
  6609.             lea    DPBBuf,a2
  6610.             @repeat [ d6, #MAXDPB-1 ].w {
  6611.                 move.l    XDPB_NextXDPBPtr(a2),DPBTable_NextXDPBPtr(a1)
  6612.                 move.b    XDPB_DriveNo(a2),DPBTable_DriveNo(a1)
  6613.                 lea    SizeOf1DPBTable(a1),a1
  6614.                 lea    SizeOfXDPB(a2),a2
  6615.             }
  6616.  
  6617.             * DPB情報初期化
  6618.             lea    DPBTable,a1
  6619.             @repeat [ d6, #MAXDPB-1 ].w {
  6620.                 clr.l    DPBTable_XDPBPtr(a1)
  6621.                 clr.l    DPBTable_BaseSec(a1)
  6622.                 clr.w    DPBTable_Sft(a1)
  6623.                 lea    SizeOf1DPBTable(a1),a1
  6624.             }
  6625.             lea    DPBBuf,a1
  6626.             lea    __SUSIEDEVH,a2
  6627.             moveq.l    #0,d1
  6628.             @repeat [ d6, #MAXDPB-1 ].w {
  6629.                 move.l    a1,a0
  6630.                 @repeat [ d7, #SizeOfXDPB-1 ].w {
  6631.                     clr.b    (a0)+
  6632.                 }
  6633.                 * ダミー情報
  6634.                 move.w    (SDDMode),d0
  6635.                 @switch [ d0 ].w {
  6636.                   @case #1:
  6637.                     move.b    d1,XDPB_UnitNo(a1)
  6638.                     move.l    a2,XDPB_DEVHPtr(a1)
  6639.                     move.w    #0,XDPB_SecByte(a1)
  6640.                     move.w    #0,XDPB_FATSec(a1)
  6641.                     move.b    #1,XDPB_FATNum(a1)
  6642.                     move.b    #$01,XDPB_FATSize(a1)
  6643.                     move.w    #$0008,XDPB_RootEntryNum(a1)
  6644.                     move.w    #$0003,XDPB_DataSec(a1)
  6645.                     move.w    #$0003,XDPB_CluNum(a1)
  6646.                     move.w    #$0002,XDPB_RootSec(a1)
  6647.                     move.b    #$f5,XDPB_MediaID(a1)
  6648.                     move.b    #$0b,XDPB_SftSecByte(a1)
  6649.                     @break;
  6650.                   @default:
  6651.                     move.b    d1,XDPB_UnitNo(a1)
  6652.                     move.l    a2,XDPB_DEVHPtr(a1)
  6653.                     move.w    #$400,XDPB_SecByte(a1)
  6654.                     move.w    #1,XDPB_FATSec(a1)
  6655.                     move.b    #1,XDPB_FATNum(a1)
  6656.                     move.b    #$01,XDPB_FATSize(a1)
  6657.                     move.w    #$0008,XDPB_RootEntryNum(a1)
  6658.                     move.w    #$0003,XDPB_DataSec(a1)
  6659.                     move.w    #$0003,XDPB_CluNum(a1)
  6660.                     move.w    #$0002,XDPB_RootSec(a1)
  6661.                     tst.b    (SCSI_RemovableFlag)
  6662.                     @ifst    {
  6663.                         move.b    #$f6,XDPB_MediaID(a1)
  6664.                     } @else {
  6665.                         move.b    #$f7,XDPB_MediaID(a1)
  6666.                     }
  6667.                     move.b    #$0a,XDPB_SftSecByte(a1)
  6668.                     @break;
  6669.                 }
  6670.  
  6671.                 lea    SizeOfXDPB(a1),a1
  6672.                 addq.w    #1,d1
  6673.             }
  6674.             lea    DPBTable,a1
  6675.             lea    DPBBuf,a2
  6676.             @repeat [ d6, #MAXDPB-1 ].w {
  6677.                 move.l    DPBTable_NextXDPBPtr(a1),XDPB_NextXDPBPtr(a2)
  6678.                 move.b    DPBTable_DriveNo(a1),XDPB_DriveNo(a2)
  6679.                 lea    SizeOf1DPBTable(a1),a1
  6680.                 lea    SizeOfXDPB(a2),a2
  6681.             }
  6682.  
  6683.           ?_e::
  6684.             movem.l    (sp)+,d1-d7/a0-a6
  6685.             rts
  6686.         }
  6687.  
  6688.  
  6689. *************************************************************************
  6690.  
  6691.  
  6692. *    void    SetSpecialOptionSDD( void );
  6693. *
  6694. *        特殊オプションを設定する。
  6695. *        in    a1    特殊スイッチ
  6696. *        out    なし
  6697.  
  6698.  
  6699.         @xproc    [ SetSpecialOptionSDD ] {
  6700.             @param    [ a1, SpOption ].l;
  6701.  
  6702.             movem.l    d1-d7/a0-a6,-(sp)
  6703.  
  6704.             * 特殊スイッチ登録
  6705.             @do {
  6706.                 move.l    (SpOption)+,d0
  6707.                 @break.eq;
  6708.                 @switch [ d0 ].l {
  6709.                   @case    #'SID:':
  6710.                     move.l    (SpOption),d0
  6711.                     move.l    d0,(SCSI_ID)
  6712.                     @break;
  6713.                   @case    #'98:C':
  6714.                     move.l    (SpOption),(SpOption_98C)
  6715.                     @break;
  6716.                   @case    #'EJE:':
  6717.                     moveq.l    #0,d0
  6718.                     tst.l    (SpOption)
  6719.                     @ifne    {
  6720.                         moveq.l    #1,d0
  6721.                     }
  6722.                     move.b    d0,(ForceEjectFlag)
  6723.                     @break;
  6724.                   @case    #'WPR:':
  6725.                     moveq.l    #0,d0
  6726.                     tst.l    (SpOption)
  6727.                     @ifne    {
  6728.                         moveq.l    #1,d0
  6729.                     }
  6730.                     move.b    d0,(ForceProtectFlag)
  6731.                     @break;
  6732.                   @case    #'BSY:':
  6733.                     moveq.l    #0,d0
  6734.                     tst.l    (SpOption)
  6735.                     @ifne    {
  6736.                         moveq.l    #1,d0
  6737.                     }
  6738.                     move.b    d0,(SCSI_WaitBusyFlag)
  6739.                     @break;
  6740.                   @case    #'HVF:':
  6741.                     move.l    (SpOption),d0
  6742.                     move.b    d0,(SCSI_VERIFYMode)
  6743.                     @break;
  6744.                   @case    #'REZ:':
  6745.                     moveq.l    #0,d0
  6746.                     tst.l    (SpOption)
  6747.                     @ifne    {
  6748.                         moveq.l    #1,d0
  6749.                     }
  6750.                     move.b    d0,(SCSI_NoREZEROUNITFlag)
  6751.                     @break;
  6752.                   @case    #'RWE:':
  6753.                     moveq.l    #0,d0
  6754.                     tst.l    (SpOption)
  6755.                     @ifne    {
  6756.                         moveq.l    #1,d0
  6757.                     }
  6758.                     move.b    d0,(SCSI_TestRWEXTFlag)
  6759.                     @break;
  6760.                   @case    #'TEJ:':
  6761.                     move.l    (SpOption),(SpOption_TEJ)
  6762.                     @break;
  6763.                   @case    #'TWA:':
  6764.                     move.l    (SpOption),(SpOption_TWA)
  6765.                     @break;
  6766.                   @case    #'TIN:':
  6767.                     move.l    (SpOption),(SpOption_TIN)
  6768.                     @break;
  6769.                   @case    #'BRS:':
  6770.                     moveq.l    #0,d0
  6771.                     tst.l    (SpOption)
  6772.                     @ifne    {
  6773.                         moveq.l    #1,d0
  6774.                     }
  6775.                     move.b    d0,(BrowseResourceFlag)
  6776.                     @break;
  6777.                   @case    #'PAA:':
  6778.                     moveq.l    #0,d0
  6779.                     tst.l    (SpOption)
  6780.                     @ifne    {
  6781.                         moveq.l    #1,d0
  6782.                     }
  6783.                     move.b    d0,(ReqSendPlayAudioAdrFlag)
  6784.                     @break;
  6785.                 }
  6786.                 addq.l    #4,SpOption
  6787.             } @while.t;
  6788.  
  6789.           ?_e::
  6790.             movem.l    (sp)+,d1-d7/a0-a6
  6791.             rts
  6792.         }
  6793.  
  6794.  
  6795. *************************************************************************
  6796.  
  6797.  
  6798. *    void    GetSpecialOptionSDD( void );
  6799. *
  6800. *        特殊オプションを読み出す。
  6801. *        in    a1    特殊スイッチを納めるバッファ
  6802. *        out    なし
  6803.  
  6804.  
  6805.         @xproc    [ GetSpecialOptionSDD ] {
  6806.             @param    [ a1, SpOption ].l;
  6807.  
  6808.             movem.l    d1-d7/a0-a6,-(sp)
  6809.  
  6810.             * 特殊スイッチ読み出し
  6811.             * SID:
  6812.             move.l    #'SID:',(SpOption)+
  6813.             move.l    (SCSI_ID),d0
  6814.             move.l    d0,(SpOption)+
  6815.  
  6816.             * 98:C
  6817.             move.l    #'98:C',(SpOption)+
  6818.             move.l    (SpOption_98C),(SpOption)+
  6819.  
  6820.             * EJE:
  6821.             move.l    #'EJE:',(SpOption)+
  6822.             moveq.l    #0,d0
  6823.             move.b    (ForceEjectFlag),d0
  6824.             move.l    d0,(SpOption)+
  6825.  
  6826.             * WPR:
  6827.             move.l    #'WPR:',(SpOption)+
  6828.             moveq.l    #0,d0
  6829.             move.b    (ForceProtectFlag),d0
  6830.             move.l    d0,(SpOption)+
  6831.  
  6832.             * BSY:
  6833.             move.l    #'BSY:',(SpOption)+
  6834.             moveq.l    #0,d0
  6835.             move.b    (SCSI_WaitBusyFlag),d0
  6836.             move.l    d0,(SpOption)+
  6837.  
  6838.             * HVF:
  6839.             move.l    #'HVF:',(SpOption)+
  6840.             moveq.l    #0,d0
  6841.             move.b    (SCSI_VERIFYMode),d0
  6842.             move.l    d0,(SpOption)+
  6843.  
  6844.             * REZ:
  6845.             move.l    #'REZ:',(SpOption)+
  6846.             moveq.l    #0,d0
  6847.             move.b    (SCSI_NoREZEROUNITFlag),d0
  6848.             move.l    d0,(SpOption)+
  6849.  
  6850.             * WRE:
  6851.             move.l    #'WRE:',(SpOption)+
  6852.             moveq.l    #0,d0
  6853.             move.b    (SCSI_TestRWEXTFlag),d0
  6854.             move.l    d0,(SpOption)+
  6855.  
  6856.             * TEJ:
  6857.             move.l    #'TEJ:',(SpOption)+
  6858.             moveq.l    #0,d0
  6859.             move.l    (SpOption_TEJ),(SpOption)+
  6860.  
  6861.             * TWA:
  6862.             move.l    #'TWA:',(SpOption)+
  6863.             moveq.l    #0,d0
  6864.             move.l    (SpOption_TWA),(SpOption)+
  6865.  
  6866.             * TIN:
  6867.             move.l    #'TIN:',(SpOption)+
  6868.             moveq.l    #0,d0
  6869.             move.l    (SpOption_TIN),(SpOption)+
  6870.  
  6871.             * BRS:
  6872.             move.l    #'BRS:',(SpOption)+
  6873.             moveq.l    #0,d0
  6874.             move.b    (BrowseResourceFlag),d0
  6875.             move.l    d0,(SpOption)+
  6876.  
  6877.             * PAA:
  6878.             move.l    #'PAA:',(SpOption)+
  6879.             moveq.l    #0,d0
  6880.             move.b    (ReqSendPlayAudioAdrFlag),d0
  6881.             move.l    d0,(SpOption)+
  6882.  
  6883.             clr.l    (SpOption)+
  6884.  
  6885.           ?_e::
  6886.             movem.l    (sp)+,d1-d7/a0-a6
  6887.             rts
  6888.         }
  6889.  
  6890.  
  6891. *************************************************************************
  6892.  
  6893.  
  6894. *    void    InstallSDD( void );
  6895. *
  6896. *        SDDをインストールする。
  6897. *        in    d1    SCSI ID
  6898. *            d2    最大登録DPB数(=ドライブ数)
  6899. *            d3    登録用スイッチ
  6900. *                b0    S_VERIFYを使用するなら1
  6901. *                b1    EXTコマンドを使用するなら1
  6902. *                b2    BusyでWait/Retryするなら1
  6903. *                b3    b0と組み合わせてベリファイモードとして使用
  6904. *            a1    ドライブ名文字列("A"~"Z",$00で終了)
  6905. *        out    d0    エラーなら負で帰る。
  6906.  
  6907.  
  6908.         @xproc    [ InstallSDD ] {
  6909.             @param    [ d1, IDNo ].l;
  6910.             @param    [ d2, DPBCnt ].l;
  6911.             @param    [ d3, Switch ].l;
  6912.             @param    [ a1, DriveName ].l;
  6913.             @param    [ a2, SpOption ].l;
  6914.  
  6915.             movem.l    d1-d7/a0-a6,-(sp)
  6916.  
  6917.             * 準備
  6918.             move.l    IDNo,(SCSI_ID)
  6919.             move.b    DPBCnt,(DPBMaxCount)
  6920.             move.l    Switch,(InstallSwitch)
  6921.             lea    DriveNameBuf,a0
  6922.             StrCpy    (DriveName)+,(a0)+
  6923.  
  6924.             * 準備その2
  6925.             move.l    ($1800+$30*4).w,a0
  6926.             jsr    (a0)
  6927.             move.w    d0,(HumanVersion)
  6928.             move.w    #DEFCDROMCacheBufSize,d0
  6929.             bsr    SetBufferSize
  6930.  
  6931.             * スイッチ登録
  6932.             moveq.l    #0,d1
  6933.             move.l    (InstallSwitch),d0
  6934.             btst.l    #0,d0
  6935.             @ifst    {
  6936.                 bset    #0,d1
  6937.             }
  6938.             btst.l    #3,d0
  6939.             @ifst    {
  6940.                 bset    #1,d1
  6941.             }
  6942.             move.b    d1,(SCSI_VERIFYMode)
  6943.             btst.l    #1,d0
  6944.             @ifst    {
  6945.                 move.b    #1,(SCSI_TestRWEXTFlag)
  6946.             }
  6947.             btst.l    #2,d0
  6948.             sst.b    (SCSI_WaitBusyFlag)
  6949.             @ifst    {
  6950.                 move.b    #1,(SCSI_WaitBusyFlag)
  6951.             }
  6952.  
  6953.             * ワーク初期化
  6954.             lea    DPBTable,a1
  6955.             @repeat [ d6, #MAXDPB-1 ].w {
  6956.                 move.l    #-1,DPBTable_NextXDPBPtr(a1)
  6957.                 move.b    #0,DPBTable_DriveNo(a1)
  6958.                 lea    SizeOf1DPBTable(a1),a1
  6959.             }
  6960.  
  6961.             * IOCSワークセット
  6962.             move.l    (SCSI_ID),d0
  6963.             move.b    ($cec.w),d1
  6964.             bset    d0,d1
  6965.             move.b    d1,($cec.w)
  6966.  
  6967.             * デバイスドライバ接続
  6968.             lea    __SUSIEDEVH,a1
  6969.             move.l    a1,-(sp)
  6970.             tst.b    (DeviceInstalled)
  6971.             @ifcl    {
  6972.                 jsr    __RegistDeviceDriver
  6973.             } @else {
  6974.                 jsr    __RegistDeviceDriver2
  6975.             }
  6976.             addq.w    #4,sp
  6977.  
  6978.             * DPB作成
  6979.             st.b    (SCSI_RemovableFlag)
  6980.             bsr    InitDPB
  6981.             bsr    SCSI_S_SETFLAG
  6982.             bsr    RemakeDPB
  6983.  
  6984.             * ドライブを接続
  6985.             lea    TmpDINFBuf,a0
  6986.             lea    DriveNameBuf,a1
  6987.             lea    DPBBuf,a2
  6988.             lea    OldDINFBuf,a3
  6989.             moveq.l    #0,d7
  6990.             move.b    (DPBMaxCount),d7
  6991.             subq.w    #1,d7
  6992.             @repeat [ d7 ].w {
  6993.                 * 旧情報保存
  6994.                 moveq.l    #0,d0
  6995.                 move.b    (a1),d0
  6996.                 subi.b    #'A',d0
  6997.                 move.l    a3,-(sp)
  6998.                 move.l    d0,-(sp)
  6999.                 jsr    __UnregistDrive
  7000.                 addq.w    #8,sp
  7001.                 tst.l    d0
  7002.                 @ifmi    {
  7003.                     move.l    d0,DINF_PDriveNo(a3)
  7004.                 }
  7005.  
  7006.                 * 新情報登録
  7007.                 move.l    #__SUSIEDEVH,DINF_DEVHPtr(a0)
  7008.                 move.l    a2,DINF_XDPBPtr(a0)
  7009.                 move.l    a0,-(sp)
  7010.                 moveq.l    #0,d0
  7011.                 move.b    (a1),d0
  7012.                 subi.b    #'A',d0
  7013.                 move.l    d0,-(sp)
  7014.                 jsr    __RegistDrive
  7015.                 addq.w    #8,sp
  7016.  
  7017.                 * Next
  7018.                 lea    SizeOfXDPB(a2),a2
  7019.                 lea    SizeOfDINF(a3),a3
  7020.               ?_Next::
  7021.                 addq.w    #1,a1
  7022.             }
  7023.  
  7024.             * DPB情報バックアップ
  7025.             lea    DPBTable,a1
  7026.             lea    DPBBuf,a2
  7027.             @repeat [ d6, #MAXDPB-1 ].w {
  7028.                 move.l    XDPB_NextXDPBPtr(a2),DPBTable_NextXDPBPtr(a1)
  7029.                 move.b    XDPB_DriveNo(a2),DPBTable_DriveNo(a1)
  7030.                 lea    SizeOf1DPBTable(a1),a1
  7031.                 lea    SizeOfXDPB(a2),a2
  7032.             }
  7033.             moveq.l    #0,d0
  7034.  
  7035.           ?_e::
  7036.             movem.l    (sp)+,d1-d7/a0-a6
  7037.             rts
  7038.  
  7039.         }
  7040.  
  7041.  
  7042. *************************************************************************
  7043.  
  7044.  
  7045. *    void    ReleaseSDD( void );
  7046. *
  7047. *        SDDを解除する。
  7048. *        in    なし
  7049. *        out    なし
  7050.  
  7051.  
  7052.         @xproc    [ ReleaseSDD ] {
  7053.             movem.l    d1-d7/a0-a6,-(sp)
  7054.  
  7055.             * デバイスドライバを切断
  7056.             lea    __SUSIEDEVH,a1
  7057.             move.l    a1,-(sp)
  7058.             jsr    __UnregistDeviceDriver
  7059.             addq.w    #4,sp
  7060.  
  7061.             * ドライブを切断
  7062.             lea    DPBBuf,a2
  7063.             lea    OldDINFBuf,a3
  7064.             moveq.l    #0,d7
  7065.             move.b    (DPBMaxCount),d7
  7066.             subq.w    #1,d7
  7067.             @repeat [ d7 ].w {
  7068.                 * 新情報削除
  7069.                 pea    TmpDINFBuf
  7070.                 move.l    #$100,d0
  7071.                 move.b    XDPB_DriveNo(a2),d0
  7072.                 move.l    d0,-(sp)
  7073.                 jsr    __UnregistDrive
  7074.                 addq.w    #8,sp
  7075.  
  7076.                 * 旧情報復元
  7077.                 move.l    DINF_PDriveNo(a3),d0
  7078.                 @ifpl    {
  7079.                     move.l    a3,-(sp)
  7080.                     ori.l    #$100,d0
  7081.                     move.l    d0,-(sp)
  7082.                     jsr    __RegistDrive
  7083.                     addq.w    #8,sp
  7084.                 }
  7085.  
  7086.                 * Next
  7087.                 lea    SizeOfXDPB(a2),a2
  7088.                 lea    SizeOfDINF(a3),a3
  7089.             }
  7090.  
  7091.           ?_e::
  7092.             movem.l    (sp)+,d1-d7/a0-a6
  7093.             rts
  7094.         }
  7095.  
  7096.  
  7097. *************************************************************************
  7098.  
  7099.  
  7100. *    int    AskReleaseSDD( void );
  7101. *
  7102. *        SDDが解除できるかどうかを調べる。
  7103. *        in    なし
  7104. *        out    d0    解除できれば0を返す
  7105. *                できなければ-$ffffff00+原因となる物理ドライブ番号
  7106.  
  7107.  
  7108.         @xproc    [ AskReleaseSDD ] {
  7109.             movem.l    d1-d7/a0-a6,-(sp)
  7110.  
  7111.             * ドライブを切断チェック
  7112.             lea    DPBBuf,a2
  7113.             moveq.l    #0,d7
  7114.             move.b    (DPBMaxCount),d7
  7115.             subq.w    #1,d7
  7116.             @repeat [ d7 ].w {
  7117.                 * 検査
  7118.                 pea    TmpDINFBuf
  7119.                 move.l    #$100,d0
  7120.                 move.b    XDPB_DriveNo(a2),d0
  7121.                 move.l    d0,-(sp)
  7122.                 jsr    __AskDrive
  7123.                 addq.w    #8,sp
  7124.                 tst.l    d0
  7125.                 bmi    ?_Err_Unreleasable
  7126.  
  7127.                 lea    TmpDINFBuf,a0
  7128.                 move.l    DINF_DEVHPtr(a0),a0
  7129.                 lea    __SUSIEDEVH,a1
  7130.                 cmpa.l    a0,a1
  7131.                 bne    ?_Err_Unreleasable
  7132.  
  7133.                 lea    TmpDINFBuf,a0
  7134.                 move.l    DINF_XDPBPtr(a0),a0
  7135.                 cmpa.l    a0,a2
  7136.                 bne    ?_Err_Unreleasable
  7137.  
  7138.                 * Next
  7139.                 lea    SizeOfXDPB(a2),a2
  7140.             }
  7141.  
  7142.             * DEVICE=の場合はその旨を返す
  7143.             tst.b    (DeviceInstalled)
  7144.             bst    ?_FromConfigSys
  7145.  
  7146.             moveq.l    #0,d0
  7147.             bra    ?_e
  7148.  
  7149.           ?_Err_Unreleasable::
  7150.             moveq.l    #-1,d0
  7151.             move.b    XDPB_DriveNo(a2),d0
  7152.             bra    ?_e
  7153.  
  7154.           ?_FromConfigSys::
  7155.             moveq.l    #1,d0
  7156.             bra    ?_e
  7157.  
  7158.           ?_e::
  7159.             movem.l    (sp)+,d1-d7/a0-a6
  7160.             rts
  7161.         }
  7162.  
  7163.  
  7164. *************************************************************************
  7165.  
  7166.  
  7167. *    int    CalibrateSDD( void );
  7168. *
  7169. *        SDDをディスク挿入直後の状態にする。
  7170. *        in    d1    !0でフラグの設定のみを行なう
  7171. *        out    d0    ドライブ数+(SCSI ID*$100)+(LUN*$1000)+(FormatType*$10000)+(使用可能ドライブ数*$1000000)
  7172. *            a1    DPBTableへのポインタ
  7173.  
  7174.  
  7175.         @xproc    [ CalibrateSDD ] {
  7176.             move.l    d1,-(sp)
  7177.  
  7178.             bsr    SCSI_S_SETFLAG
  7179.             clr.l    (LastAccessTime)
  7180.             clr.l    (LastAccessDate)
  7181.             tst.l    d1
  7182.             bst    ?_e
  7183.  
  7184.             bsr    RemakeDPB
  7185.             move.w    (FormatType),d0
  7186.             @ifpl    {
  7187.                 rol.w    #8,d0
  7188.                 move.b    (DPBCount),d0
  7189.                 rol.w    #8,d0
  7190.             }
  7191.             swap    d0
  7192.             move.l    (SCSI_ID),d1
  7193.             lsl.w    #8,d1
  7194.             lsl.w    #4,d1
  7195.             lsr.l    #4,d1
  7196.             move.w    d1,d0
  7197.             move.b    (DPBMaxCount),d0
  7198.             lea    DPBTable,a1
  7199.  
  7200.           ?_e::
  7201.             st.b    (ReqRemakeDPB)
  7202.             move.l    (sp)+,d1
  7203.             rts
  7204.         }
  7205.  
  7206.  
  7207. *************************************************************************
  7208.  
  7209.  
  7210. *    int    AskSDD( void );
  7211. *
  7212. *        SDDの現在状況を調べる。
  7213. *        in    なし
  7214. *        out    d0    ドライブ数+(SCSI ID*$100)+(LUN*$1000)+(FormatType*$10000)+(使用可能ドライブ数*$1000000)
  7215. *            a1    DPBTableへのポインタ
  7216.  
  7217.  
  7218.         @xproc    [ AskSDD ] {
  7219.             move.l    d1,-(sp)
  7220.  
  7221.             move.w    (FormatType),d0
  7222.             @ifpl    {
  7223.                 rol.w    #8,d0
  7224.                 move.b    (DPBCount),d0
  7225.                 rol.w    #8,d0
  7226.             }
  7227.             swap    d0
  7228.             move.l    (SCSI_ID),d1
  7229.             lsl.w    #8,d1
  7230.             lsl.w    #4,d1
  7231.             lsr.l    #4,d1
  7232.             move.w    d1,d0
  7233.             move.b    (DPBMaxCount),d0
  7234.             lea    DPBTable,a1
  7235.  
  7236.           ?_e::
  7237.             move.l    (sp)+,d1
  7238.             rts
  7239.         }
  7240.  
  7241.  
  7242. *************************************************************************
  7243.  
  7244.  
  7245. *    int    AskSDDVersion( void );
  7246. *
  7247. *        SDDのバージョンを得る。
  7248. *        in    なし
  7249. *        out    d0    バージョン番号(1.23Aなら$0001_2341)
  7250.  
  7251.  
  7252.         @xproc    [ AskSDDVersion ] {
  7253.  
  7254.             move.l    #SUSIEVERH*$10000+SUSIEVERM*$1000+SUSIEVERL*$100+SUSIEVERR,d0
  7255.  
  7256.           ?_e::
  7257.             rts
  7258.         }
  7259.  
  7260.  
  7261. *************************************************************************
  7262.  
  7263.  
  7264. *    int    SetForceEjectSDD( int flag );
  7265. *
  7266. *        強制Ejectフラグの設定をする。
  7267. *        in    d1    1で強制Eject状態、0で強制Eject解除
  7268. *                -1で現在の状態を得る
  7269. *        out    d0    現在の状態
  7270.  
  7271.  
  7272.         @xproc    [ SetForceEjectSDD ] {
  7273.  
  7274.             move.b    (DisableUserEjectFlag),d0
  7275.             or.b    (DisableOSEjectFlag),d0
  7276.             @ifst    {
  7277.                 moveq.l    #-1,d1
  7278.             }
  7279.             moveq.l    #0,d0
  7280.             move.b    (ForceEjectFlag),d0
  7281.             tst.l    d1
  7282.             @ifpl    {
  7283.                 move.b    d1,(ForceEjectFlag)
  7284.                 bsr    SCSI_S_SETFLAG
  7285.                 clr.l    (LastAccessTime)
  7286.                 clr.l    (LastAccessDate)
  7287.                 bsr    RemakeDPB
  7288.             }
  7289.  
  7290.           ?_e::
  7291.             rts
  7292.         }
  7293.  
  7294.  
  7295. *************************************************************************
  7296.  
  7297.  
  7298. *    int    SetForceProtectSDD( int flag );
  7299. *
  7300. *        強制Protectフラグの設定をする。
  7301. *        in    d1    1で強制Protect状態、0で強制Protect解除
  7302. *                -1で現在の状態を得る
  7303. *        out    d0    現在の状態
  7304.  
  7305.  
  7306.         @xproc    [ SetForceProtectSDD ] {
  7307.  
  7308.             moveq.l    #0,d0
  7309.             move.b    (ForceProtectFlag),d0
  7310.             tst.l    d1
  7311.             @ifpl    {
  7312.                 move.b    d1,(ForceProtectFlag)
  7313.                 bsr    SCSI_S_SETFLAG
  7314.                 clr.l    (LastAccessTime)
  7315.                 clr.l    (LastAccessDate)
  7316.                 bsr    RemakeDPB
  7317.             }
  7318.  
  7319.           ?_e::
  7320.             rts
  7321.         }
  7322.  
  7323.  
  7324. *************************************************************************
  7325.  
  7326.  
  7327. *    int    __DDD_INSTALL( void );
  7328. *
  7329. *        DEVICE=で起動した時のエントリポイント。
  7330. *        in    デバイスドライバ起動方法の通り
  7331. *        out    デバイスドライバ起動方法の通り
  7332.  
  7333.  
  7334.         @xproc    [ __DDD_INSTALL ] {
  7335.  
  7336.             tst.b    (DeviceInstalled)
  7337.             @ifcl    {
  7338.                 jsr    DDD_INSTALL
  7339.             } @else {
  7340.                 move.w    #$5003,d0
  7341.             }
  7342.  
  7343.             rts
  7344.         }
  7345.  
  7346.  
  7347. *************************************************************************
  7348.  
  7349.  
  7350. *    int    InstallSCSICALL( void );
  7351. *
  7352. *        SCSIコールをインストールする。
  7353. *        in    なし
  7354. *        out    d0    負でインストールできなかった
  7355.  
  7356.  
  7357.         @xproc    [ InstallSCSICALL ] {
  7358.             movem.l    d1-d7/a0-a6,-(sp)
  7359.  
  7360.             * IOCSコールをチェック
  7361.             cmpi.b    #$f5,($7d4.w)
  7362.             bne    ?_OK
  7363.  
  7364.             * 外付けSCSIボードをチェック
  7365.             lea    $ea0020,a1
  7366.             bsr    ?_PortCheck
  7367.             tst.l    d0
  7368.             bne    @f
  7369.             cmpi.l    #'SCSI',$24(a1)
  7370.             bne    @f
  7371.             cmpi.w    #'EX',$28(a1)
  7372.             beq    ?_Install
  7373.           @@:
  7374.  
  7375.             * 内蔵版をチェック
  7376.             lea    $fc0000,a1
  7377.             bsr    ?_PortCheck
  7378.             tst.l    d0
  7379.             bne    @f
  7380.             cmpi.l    #'SCSI',$24(a1)
  7381.             bne    @f
  7382.             cmpi.w    #'IN',$28(a1)
  7383.             beq    ?_Install
  7384.           @@:
  7385.             bra    ?_NG
  7386.  
  7387.           ?_PortCheck::
  7388.             * バスエラーチェック
  7389.             move.l    sp,a2
  7390.             move.l    ($0008.w),a3
  7391.             move.l    #?_PortCheck_NG,($0008.w)
  7392.             move.l    (a1),d0
  7393.             btst.l    #0,d0
  7394.             bst    ?_PortCheck_NG
  7395.             cmpi.l    #$200000,d0
  7396.             bcs    ?_PortCheck_NG
  7397.             moveq.l    #0,d0
  7398.           ?_PortCheck_Quit::
  7399.             move.l    a3,($0008.w)
  7400.             move.l    a2,sp
  7401.             rts
  7402.  
  7403.           ?_PortCheck_NG::
  7404.             moveq.l    #-1,d0
  7405.             bra    ?_PortCheck_Quit
  7406.  
  7407.           ?_Install::
  7408.             * ROMチェック
  7409.             move.l    (a1),a1
  7410.             cmpi.l    #'Huma',-8(a1)
  7411.             bne    ?_NG
  7412.             cmpi.l    #'n68k',-4(a1)
  7413.             bne    ?_NG
  7414.  
  7415.             * S-RAMチェック
  7416.             cmpi.b    #'V',($ed006f)
  7417.             @ifne    {
  7418.                 move.b    #$31,($e8e00d)
  7419.                 move.b    #'V',($ed006f)
  7420.                 move.w    #$0700,($ed0070)
  7421.                 cmpa.l    #$ea0020,a0
  7422.                 @ifeq    {
  7423.                     ori.w    #$0800,($ed0070)
  7424.                 }
  7425.                 move.b    #$00,($e8e00d)
  7426.             }
  7427.  
  7428.             * ベクタ設定
  7429.             move.l    -$0c(a1),-(sp)
  7430.             move.w    #$f5+$100,-(sp)
  7431.             DOS    _INTVCS
  7432.             addq.w    #6,sp
  7433.  
  7434.             * OK
  7435.             moveq.l    #0,d0
  7436.             bra    ?_Quit
  7437.  
  7438.           ?_OK::
  7439.             moveq.l    #0,d0
  7440.             bra    ?_Quit
  7441.  
  7442.           ?_NG::
  7443.             moveq.l    #-1,d0
  7444.             bra    ?_Quit
  7445.  
  7446.           ?_Quit::
  7447.             movem.l    (sp)+,d1-d7/a0-a6
  7448.             rts
  7449.         }
  7450.  
  7451.  
  7452. *************************************************************************
  7453.  
  7454.  
  7455. *        32bit割り算 from GNULIB.a
  7456.  
  7457. ___divsi3::
  7458.         move.l    $0004(sp),d1
  7459.         move.l    d1,d0
  7460.         swap.w    d0
  7461.         or.w    $0008(sp),d0
  7462.         bne    L000018
  7463.         divu.w    $000a(sp),d1
  7464.         moveq.l    #$00,d0
  7465.         move.w    d1,d0
  7466.         rts
  7467.  
  7468. L000018:
  7469.         move.l    d1,d0
  7470.         bpl    L000030
  7471.         neg.l    d0
  7472.         move.l    $0008(sp),d1
  7473.         beq    L000040
  7474.         bpl    L00002a
  7475.         neg.l    d1
  7476. L000028:
  7477.         bra    L000092
  7478. L00002a:
  7479.         bsr    L000092
  7480.         neg.l    d0
  7481.         rts
  7482.  
  7483. L000030:
  7484.         move.l    $0008(sp),d1
  7485.         beq    L000040
  7486.         bpl    L000028
  7487.         neg.l    d1
  7488.         bsr    L000092
  7489.         neg.l    d0
  7490.         rts
  7491.  
  7492. L000040:
  7493.         moveq.l    #$00,d0
  7494.         rts
  7495.  
  7496. L000044:
  7497.         moveq.l    #$01,d0
  7498.         rts
  7499.  
  7500. L000048:
  7501.         moveq.l    #$00,d1
  7502.         divu.w    d1,d0
  7503.         rts
  7504.  
  7505. L00004e:
  7506.         move.l    d0,d2
  7507.         clr.w    d2
  7508.         swap.w    d2
  7509.         divu.w    d1,d2
  7510.         movea.l    d2,a0
  7511.         move.w    d0,d2
  7512.         divu.w    d1,d2
  7513.         move.w    a0,d0
  7514.         swap.w    d0
  7515.         move.w    d2,d0
  7516.         rts
  7517.  
  7518. L000064:
  7519.         swap.w    d0
  7520.         swap.w    d1
  7521.         divu.w    d1,d0
  7522.         and.l    #$0000ffff,d0
  7523.         rts
  7524.  
  7525. ___udivsi3::
  7526.         move.l    $0004(sp),d1
  7527.         move.l    d1,d0
  7528.         swap.w    d0
  7529.         or.w    $0008(sp),d0
  7530.         bne    L00008a
  7531.         divu.w    $000a(sp),d1
  7532.         moveq.l    #$00,d0
  7533.         move.w    d1,d0
  7534.         rts
  7535.  
  7536. L00008a:
  7537.         move.l    d1,d0
  7538.         move.l    $0008(sp),d1
  7539.         beq    L000040
  7540. L000092:
  7541.         cmp.l    d0,d1
  7542.         beq    L000044
  7543.         bhi    L000040
  7544.         cmp.l    #$00010000,d1
  7545.         bcs    L00004e
  7546.         move.w    d0,d2
  7547.         or.w    d1,d2
  7548.         beq    L000064
  7549.         movea.l    d0,a1
  7550.         movea.l    d1,a2
  7551.         cmp.l    #$01000000,d1
  7552.         bcc    L0000c0
  7553.         move.l    d1,d2
  7554.         swap.w    d2
  7555.         move.b    L0000f0(pc,d2.w),d2
  7556.         lsr.l    d2,d1
  7557.         lsr.l    d2,d0
  7558.         bra    L0000d0
  7559. L0000c0:
  7560.         move.l    d1,d2
  7561.         swap.w    d2
  7562.         lsr.w    #8,d2
  7563.         move.b    L0000f0(pc,d2.w),d2
  7564.         addq.w    #8,d2
  7565.         lsr.l    d2,d1
  7566.         lsr.l    d2,d0
  7567. L0000d0:
  7568.         divu.w    d1,d0
  7569.         and.l    #$0000ffff,d0
  7570.         move.l    d0,d2
  7571.         move.l    a2,d1
  7572.         mulu.w    d1,d2
  7573.         swap.w    d1
  7574.         mulu.w    d0,d1
  7575.         swap.w    d1
  7576.         clr.w    d1
  7577.         add.l    d1,d2
  7578.         cmp.l    a1,d2
  7579.         bls    L0000ee
  7580.         subq.l    #1,d0
  7581. L0000ee:
  7582.         rts
  7583.  
  7584. L0000f0:
  7585.         .dc.b    $00,$01,$02,$02,$03,$03,$03,$03
  7586.         .dc.b    $04,$04,$04,$04,$04,$04,$04,$04
  7587.         .dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  7588.         .dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  7589.         .dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  7590.         .dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  7591.         .dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  7592.         .dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  7593.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7594.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7595.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7596.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7597.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7598.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7599.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7600.         .dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  7601.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7602.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7603.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7604.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7605.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7606.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7607.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7608.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7609.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7610.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7611.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7612.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7613.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7614.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7615.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7616.         .dc.b    $08,$08,$08,$08,$08,$08,$08,$08
  7617.  
  7618.  
  7619. *************************************************************************
  7620.  
  7621.  
  7622. SetBufferSize::
  7623.         tst.l    (DivideAccessSize)
  7624.         @ifeq    {
  7625.             move.l    #$80,(DivideAccessSize)
  7626.         }
  7627.         move.w    d0,(CDROMCacheBufSize)
  7628.         mulu    #SoftVerifyBufSecSize,d0
  7629.         move.l    d0,(SoftVerifyBufSize)
  7630.         sub.l    #DEFSoftVerifyBufSize,d0
  7631.         move.l    d0,-(sp)
  7632.         bsr    FlushCDROMCache
  7633.         move.l    (sp)+,d0
  7634.         rts
  7635.  
  7636.  
  7637. *************************************************************************
  7638.  
  7639.  
  7640.         .even
  7641.         @STRSEC;
  7642.         .even
  7643.  
  7644.  
  7645. *************************************************************************
  7646.  
  7647.  
  7648.